ajax渲染方式是不刷新帖子中的所有值?

时间:2014-12-01 20:32:06

标签: ruby ajax ruby-on-rails-4

在我的控制器中,

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

_post.html.erb:

<% @posts.each do |post| %>
  <div id="voting_div">
    <%= render 'voting', post: post %>
  </div>
  ....
  ....
<% end %>

_voting.html.erb

<%= link_to dislike_post_path(post), method: :put, remote: true %>
<%= link_to like_post_path(post), method: :put, remote: true %>

upvote.js.erb

$("#voting_div").html("<%= escape_javascript(render('posts/voting', post: @post)) %>")

downvote.js.erb

$("#voting_div").html("<%= escape_javascript(render('posts/voting', post: @post)) %>")

所以到目前为止一切正常,当我投票给第一篇文章时,它在ajax方式下运行良好,downvote也是如此。它为upvote和downvote提供了部分刷新投票。但不适用于所有帖子。它刚好在第一篇文章中正常工作。我不知道我在哪里做错了。你能帮助我吗?

当我手动刷新页面时,该值已成功存储。

由于

1 个答案:

答案 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)) %>")

你应该看到更好的结果。