我目前正在使用' 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;相反,但这没有用。如果我删除该行,那么应用程序运行正常。
我无法解决可能造成这种情况的原因,所以我非常感谢你们的帮助,谢谢。
答案 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
中的更多详细信息
数据库迁移
Acts As Votable使用投票表存储所有投票信息。至 生成并运行迁移只是使用。
rails generate acts_as_votable:migration rake db:migrate
通过添加缓存列,您将获得性能提升 你的模特表。您必须通过您的手动执行此操作 自己的迁移。有关更多信息,请参阅本文档的缓存部分 信息。
使用可投票型号
class Post&lt;的ActiveRecord :: Base的
acts_as_votable端