0

我目前正在使用 '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”,但这没有用。如果我删除该行,则应用程序运行良好。

我无法弄清楚还有什么可能导致这种情况,所以我非常感谢这里的一些帮助,谢谢。

4

2 回答 2

0

不要忘记运行迁移:

rails generate acts_as_votable:migration
rake db:migrate

将此添加到您的评论模型中(comment.rb)

acts_as_votable

文档中的更多详细信息

数据库迁移

Acts As Votable 使用投票表来存储所有投票信息。要生成并运行迁移,只需使用。

rails 生成acts_as_votable:migration rake db:migrate

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

使用投票模型

类 Post < ActiveRecord::Base
act_as_votable

结尾

于 2017-12-05T15:08:52.627 回答
0

如果您在索引中,我会建议使用@comments而不是@comment,我还会重命名wforcomment以便更清楚它是评论。

<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> 
于 2017-12-05T14:25:19.880 回答