作为可投票的行为 - 刷新主页上的like-count [Rails - AJAX]

时间:2018-06-05 20:46:23

标签: ruby-on-rails ajax acts-as-votable

我对行为有点问题。

我喜欢的按钮,我的每个“软件”的页面上都会正确刷新计数(使用AJAX)。 但是在主页上没有正常工作(或者有几个软件)。

当我点击类似按钮(在我的主页上)时,likes-count会更新,但值会更新并且对于所有软件都是相同的(但是当我手动刷新页面时,值是正确的。)

我无法找到解决此问题的方法。

我的代码:

softwares_controller.rb

 def upvote
    if !current_user.liked? @software
      @software.liked_by current_user
    elsif current_user.liked? @software
      @software.unliked_by current_user 
    end
    respond_to do |format|
        format.html { redirect_back(fallback_location: root_path) }
        format.js 
        end
  end 

软件/显示

<%= link_to like_software_path(@software), class:"like-btn", method: :put, remote: true do %> 
    <button class="btn btn-warning"> 
      <span><p><i class="fa fa-thumbs-up fa-lg" aria-hidden="true"></i></p></span>
    </button> 
<% end %>
<span class="likes-count"> <%= @software.get_upvotes.size %> </span> 

主页视图

<%= link_to like_software_path(software), class:"like-btn", method: :put, remote: true do %> 
    <button class="btn btn-warning"> 
      <span><p><i class="fa fa-thumbs-up fa-lg" aria-hidden="true"></i></p></span>
    </button> 
<% end %>
<span class="likes-count"> <%= software.get_upvotes.size %> </span>  

的routes.rb

resources :softwares do
  member do
    put "like" => "softwares#upvote"
    put "dislike" => "softwares#downvote"
  end
end

软件/ upvotes.js.erb

<% if current_user.liked? @software %>
   $(".likes-btn").addClass("liked");
<% else %>
   $(".likes-btn").removeClass("liked");
<% end %>
   $(".likes-count").addClass("liked").html('<%= @software.get_upvotes.size %>');

编辑:或者当我用以下内容更改我的主页时

<%= link_to like_software_path(@software), class:"like-btn", method: :put, remote: true do %> 
    <button class="btn btn-warning"> 
      <span><p><i class="fa fa-thumbs-up fa-lg" aria-hidden="true"></i></p></span>
    </button> 
<% end %>
<span class="likes-count"> <%= @software.get_upvotes.size %> </span> 

我有一个错误:

No route matches {:action=>"upvote", :controller=>"softwares", :id=>nil}, missing required keys: [:id]

1 个答案:

答案 0 :(得分:3)

这一行:

$(".likes-count").addClass("liked").html('<%= @software.get_upvotes.size %>');

正在使用.likes-count类更新所有元素的显示的投票计数值。要解决此问题,请更改:

<span class="likes-count"> <%= software.get_upvotes.size %> </span>

包含软件的id,并将其定位在您的js中。

<span class="likes-count" id="software-<%= software.id %>">
  <%= software.get_upvotes.size %>
</span>

软件/ upvotes.js.erb

$("#software-<%= @software.id %>").addClass("liked").html('<%= @software.get_upvotes.size %>');