使用jquery和ajax使用Ruby on Rails更新部分

时间:2016-01-21 01:46:39

标签: jquery ruby-on-rails ajax

我已经有好几天这个问题而且无法弄明白......我已经'喜欢'和'不像'按钮。当用户喜欢"一个帖子,更新应该发生在数据库中,然后按钮应该翻转到"不像"。一切都在后端工作 - 数据库更新很好,但按钮永远不会从" Like" "与"不同。如果我手动刷新页面,它将被切换,但没有刷新就不会发生。我没有记录任何错误或在控制台中。

共享/ _like.html.erb

<%= form_for(current_user.likes.build, remote: true) do |f| %>
<div><%= hidden_field_tag :post_id, post.id %></div>
<%= f.submit "Like", class: "btn btn-primary" %>
<% end %>

共享/ _unlike.html.erb

<%= form_for(current_user.likes.find_by_post_id(post.id),
html: {method: :delete },
remote: true) do |f| %>
<%= f. submit "Unlike", class: "btn" %>
<% end %>

通过以下方式呈现: 交/ _post.html.erb

<div id="like_form">
    <% if post.does_user_like(post.id, current_user.id) %>
        <%= render 'shared/unlike', :post => post %>
    <% else %>                  
        <%= render 'shared/like', :post => post %>
    <% end %>
</div>  

喜欢/ create.js.erb

$("#like_form").html("<%= escape_javascript(render('shared/unlike', :post => @post)) %>");

喜欢控制器

def create
      user = current_user    
      post = post.find(params[:post_id])
      @post = post
      Like.create(post_id: post.id, user_id: user.id)     
      respond_to do |format|
            format.html { redirect_to request.referrer || root_url }
            format.js 
          end
  end

2 个答案:

答案 0 :(得分:0)

replaceWith

中使用html代替likes/create.js.erb

答案 1 :(得分:0)

我已经找到了问题:这里的代码:

<div id="like_form">
    <% if post.does_user_like(post.id, current_user.id) %>
        <%= render 'shared/unlike', :post => post %>
    <% else %>                  
        <%= render 'shared/like', :post => post %>
    <% end %>
</div> 

实际上是帖子的提要 - 所以每页有很多帖子。问题是代码实际上工作正常,但它更新了页面上的第一篇文章,而不是正确的帖子。我通过在每个div上添加和id解决了这个问题:

<div id="like_form-<%=post.id %>">
    <% if post.does_user_like(post.id, current_user.id) %>
        <%= render 'shared/unlike', :post => post %>
    <% else %>                  
        <%= render 'shared/like', :post => post %>
    <% end %>
</div> 

在这里调用特定的div:

$("#like_form-<%=@post.id %>").html("<%= escape_javascript(render('shared/unlike', :post => @post)) %>")