无法在Rail应用视图中显示Upvote / Downvote计数

时间:2017-12-05 14:17:51

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

我目前正在使用' acts_as_votable' Ruby gem为基本的rails应用程序中的注释提供Upvote / Downvote功能。在comments_controller.rb中,函数如下所示:

    def upvote
      @comment = Comment.find(params[:id])
      @comment.upvote_by current_user
      redirect_to comments_path
    end

    def downvote
      @comment = Comment.find(params[:id])
      @comment.downvote_by current_user
      redirect_to comment_path
    end

并在roputes.rb中:

  resources :comments do
    member do
     put "like", to: "comments#upvote"
     put "dislike", to: "comments#downvote"
    end
  end 

并且视图中的循环如下所示:

 <div class="box">
 <% @comment.each do |w| %>
    <tr>        
      <td><b><%= w.title %></b></td><br>
      <td><%= w.location %></td><br>
      <td><%= w.body %></td><br> 
      <%= link_to "upvote", like_comment_path(w), method: :put %>
      <%= @comment.upvote_by.size %>
      <%= link_to "downvote", dislike_comment_path(w), method: :put %>
      </tr>
    <% end %>
 </div> 

除了使用以下代码行之外,没有任何问题:

<%= @comment.upvote_by.size %>

返回以下错误:

undefined method `upvote_by' for #
<Comment::ActiveRecord_Relation:0x007faa8dbf0560>

我不确定为什么这个方法是未定义的,因为我认为这是一个内置于gem的方法,或者是一个ruby方法。我也不知道这是否是由于某些其他原因引发的错误消息,但我不确定这是什么。我试图使用“upvote_from&#39;相反,但这没有用。如果我删除该行,那么应用程序运行正常。

我无法解决可能造成这种情况的原因,所以我非常感谢你们的帮助,谢谢。

2 个答案:

答案 0 :(得分:0)

如果你在索引中,我建议使用@comments而不是@comment,我也会为w重命名comment,这样就更清楚了评价。

<div class="box">
 <% @comments.each do |comment| %>
    <tr>        
      <td><b><%= comment.title %></b></td><br>
      <td><%= comment.location %></td><br>
      <td><%= comment.body %></td><br> 
      <%= link_to "upvote", like_comment_path(comment), method: :put %>
      <%= comment.upvote_by.size %>
      <%= link_to "downvote", dislike_comment_path(comment), method: :put %>
      </tr>
    <% end %>
 </div> 

答案 1 :(得分:0)

不要忘记运行迁移:

rails generate acts_as_votable:migration
rake db:migrate

在评论模型中添加此内容(comment.rb)

acts_as_votable

doc

中的更多详细信息
  

数据库迁移

     

Acts As Votable使用投票表存储所有投票信息。至   生成并运行迁移只是使用。

     

rails generate acts_as_votable:migration rake db:migrate

     

通过添加缓存列,您将获得性能提升   你的模特表。您必须通过您的手动执行此操作   自己的迁移。有关更多信息,请参阅本文档的缓存部分   信息。

     

使用可投票型号

     

class Post&lt;的ActiveRecord :: Base的
     acts_as_votable