在我的控制器中,
def upvote
@post = Post.find(params[:id])
@post.upvote_by current_user
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
def downvote
@post = Post.find(params[:id])
@post.downvote_by current_user
respond_to do |format|
format.html { redirect_to :back }
format.js
end
end
<% @posts.each do |post| %>
<div id="voting_div">
<%= render 'voting', post: post %>
</div>
....
....
<% end %>
<%= link_to dislike_post_path(post), method: :put, remote: true %>
<%= link_to like_post_path(post), method: :put, remote: true %>
$("#voting_div").html("<%= escape_javascript(render('posts/voting', post: @post)) %>")
$("#voting_div").html("<%= escape_javascript(render('posts/voting', post: @post)) %>")
所以到目前为止一切正常,当我投票给第一篇文章时,它在ajax方式下运行良好,downvote也是如此。它为upvote和downvote提供了部分刷新投票。但不适用于所有帖子。它刚好在第一篇文章中正常工作。我不知道我在哪里做错了。你能帮助我吗?
当我手动刷新页面时,该值已成功存储。
由于
答案 0 :(得分:1)
您不能重复使用这样的HTML ID,您需要使用唯一的ID来引用一个唯一的帖子来查找它,并更新它。 Rails有一个帮助器dom_id
来为这些目的创建一个合理的ID。
像这样调整你的帖子文件:
<% @posts.each do |post| %>
<div id="<%= dom_id(post) %>">
<%= render 'voting', post: post %>
</div>
....
....
<% end %>
你的JS部分参考它:
$("#<%= dom_id(@post) %>").html("<%= escape_javascript(render('posts/voting', post: @post)) %>")
你应该看到更好的结果。