#ruby-on-rails #ruby-on-rails-3.2
#ruby-on-rails #ruby-on-rails-3.2
Вопрос:
У меня есть приложения rails, в которых пользователь может like
a post
, ссылка «нравится» изменится на ссылку «не нравится» (используя частичную визуализацию), когда пользователь нажмет ссылку «нравится», также он может создать одну запись like
, и она сохраняется в базе данных, я вижу, что часть отображена в журналах, но частично не отображается в представлениях, также удалена ссылка «нравится».
Started POST "/like" for 127.0.0.1 at 2014-07-01 16:45:48 0700
←[1m←[35mUser Load (1.0ms)←[0m SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Processing by HomesController#create_like as JS
Parameters: {"utf8"=>"V", "authenticity_token"=>"kRfosGW9Qsv3e8VH8MU/X/EyLVoJ/ya8T3Abwv7qNwg=", "like"=>{"post_id"=>"4"}}
←[1m←[36m (0.0ms)←[0m ←[1mBEGIN←[0m
←[1m←[35mSQL (1.0ms)←[0m INSERT INTO "likes" ("created_at", "post_id", "updated_at", "user_id") VALUES ($1, $2, $3, $4) RETURNING "id" [["created_at", Tue, 01 Jul 2014 09:45:48 UTC 00:00], ["post_id", 4], ["updated_at", Tue, 01 Jul 2014 09:45:48 UTC 00:00], ["user_id", 1]]
←[1m←[36mPost Load (1.0ms)←[0m ←[1mSELECT "posts".* FROM "posts" WHERE "posts"."id" = 4 LIMIT 1←[0m
←[1m←[35mSQL (1.0ms)←[0m UPDATE "posts" SET "count_like" = COALESCE("count_like", 0) 1 WHERE "posts"."id" = 4
←[1m←[36m (1.0ms)←[0m ←[1mCOMMIT←[0m
←[1m←[35mPost Load (1.0ms)←[0m SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 4]]
Rendered homes/_like_dislike.html.erb (0.0ms)
Rendered homes/create_like.js.erb (6.0ms)
Completed 200 OK in 42.0ms (Views: 31.0ms | ActiveRecord: 5.0ms)
Когда я попытался перезагрузить / обновить браузер, отображается ссылка «не нравится».
И этот _posts.html.erb
файл
<div class="perpost-content" id="<%= dom_id(post) %>">
<div class="perpost-body"><p><%= post.body %></p></div>
<div class="perpost-footer">
<ul class="inline">
<li id="like_<%= dom_id(post) %>">
<%= render 'like_dislike', :post => post %>
</li>
<% if post.user_id == current_user.id %><li><%= link_to "delete", destroy_post_path(post), method: :delete, data: {confirm: "yakin akan dihapus?"}, :remote => true %></li><% end %>
</ul>
</div>
</div>
_like_dislike.html.erb
файл
<% @base_secure = SecureRandom.urlsafe_base64 %>
<% if post.liked_by? current_user %>
<%= link_to "dislike", destroy_like_path(post.likes.where(:user_id => current_user.id).first.id), method: :delete, data: {confirm: "yakin akan dihapus?"}, :remote => true %>
<% else %>
<%= form_for Like.new, :url => { :action => "create_like" }, :html => {:id => "send_like_" @base_secure}, :remote => true do |f| %>
<%= f.hidden_field :post_id, :value => post.id %>
<%= link_to 'like', "#", :onclick => "$('#send_like_" @base_secure "').submit()" %>
<% end %>
<% end %>
create_like.js.erb
$('#like_<%= dom_id(@post) %>').empty().append('<%= j render :partial => "homes/like_dislike", :collection => @post, :as => :post %>');
create_like
действие на homes_controller.rb
def create_like
@like = Like.new(params[:like])
@like.user_id = current_user.id
@like.save
@post_id = params[:like][:post_id].to_i
@post = Post.find(@post_id)
respond_to do |format|
format.js
end
end
Комментарии:
1. Вы рендерите его как коллекцию в
create_like.js
, но у вас есть только один объект. Я не уверен, что это единственная проблема, но это может быть ее частью.2. @Baloo спасибо, Балу, я изменил коллекцию, чтобы локальный объект выглядел так
$('#like_<%= dom_id(@post) %>').empty().append('<%= j render :partial => "homes/like_dislike", :locals => {:post => @post } %>');
, и это работает3. Вы говорите: «Когда я пытался перезагрузить / обновить страницу, отображается ссылка «Не нравится»». Означает ли это, что частичная часть отображается, но вы видите ссылку «не нравится» вместо ссылки «нравится» из частичной?
4. @MaxWilliams Я имею в виду, что при нажатии на ссылку «нравится» «не нравится» не отображается из partial, но после этого я попытался обновить в браузере ссылку «не нравится» из partial. Отображается.
Ответ №1:
Балу сказал: «Вы рендерите его как коллекцию в create_like.js
, но у вас есть только один объект». Итак, я попытался изменить это
$('#like_<%= dom_id(@post) %>').empty().append('<%= j render :partial => "homes/like_dislike", :collection => @post, :as => :post %>');
Для
$('#like_<%= dom_id(@post) %>').empty().append('<%= j render :partial => "homes/like_dislike", :locals => {:post => @post } %>');