我通过 :collection 选项将集合 (@feed_items) 传递给 _feed_item 部分,并使用 :as => :dailypost 将其转换为dailypost。
在 _feed_item 部分中,我为 _like_button 渲染了另一个部分,并且我使用 :locals 继续使用dailypost。
数据库一切正常。喜欢被添加和删除:) 但是
我正在尝试使用(AJAX)来创建.js.erb 和destroy.js.erb 之类的按钮。出于某种原因,只有最上面的帖子得到正确更新,我必须刷新页面才能看到下面的帖子。
我知道解决方案涉及为每个“like”元素分配一个唯一的帖子 ID,比如“like-123”,但这就是我卡住的地方......
我也知道问题可能出在 _feed_items.html.erb 中,因为我传递了两个 ID ....有什么建议吗?
意见
_feed.html.erb
<% if @feed_items.any? %>
<ol>
<%= render partial: 'shared/feed_item', collection: @feed_items, :as => :dailypost %>
</ol>
<% end %>
_feed_items.html.erb
<li id="<%= @dailypost.id %>">
<span class="user">
<%= link_to dailypost.user.name, dailypost.user %>
<span class="content"><%= dailypost.content_html %></span>
<div id="like">
<%= render :partial => 'likes/like_button', :locals =>{:dailypost => dailypost} %>
</div>
</li>
_like_button.html.erb
<% if like = current_user.likes.find_by_dailypost_id(dailypost.id) %>
<%= form_for like, :html => { :method => :delete }, :remote => true do |f| %>
<%= f.submit "Unlike" %>
<% end %>
<% else %>
<%= form_for current_user.likes.build, :remote => true do |f| %>
<div><%= f.hidden_field :dailypost_id, value: dailypost.id %></div>
<%= f.hidden_field :user_id %>
<%= f.submit "Like" %>
<% end %>
<% end %>
创建.js.erb
$("#like").html("<%= escape_javascript(render :partial => 'like_button', :locals => {:dailypost => @dailypost}) %>");
销毁.js.erb
$("#like").html("<%= escape_javascript(render :partial => 'like_button', :locals => {:dailypost => @dailypost}) %>");
控制器
class LikesController < ApplicationController
respond_to :html, :js
def create
@like = Like.create(params[:like])
@dailypost = @like.dailypost
respond_to do |format|
format.js
format.html { redirect_to :back }
end
end
def destroy
like = Like.find(params[:id]).destroy
@dailypost = like.dailypost
respond_to do |format|
format.js
format.html { redirect_to :back }
end
end
end