我在rails中创建了一个基本的upvoting和downvoting系统。我有一个跟踪upvotes的列和一个跟踪downvotes的列。有没有办法可以减去这些列(可能是通过助手)来显示两者之间的投票数?
我试了一个帮手:
module PostsHelper
def count_votes(up, down)
@total = (up-down)
return @total
end
end
Index.html.erb
<% @posts.each do |post| %>
<div class="panel">
<div class="panel-left">
<%= link_to 'Upvote', upvote_post_path(post), method: :patch, remote: true %>
<%= link_to 'Downvote', downvote_post_path(post), method: :patch, remote: true %>
<%= count_votes(post.up_vote, post.down_vote) %>
<%= post.title %>
<%= post.content %>
</div>
</div>
<% end %>
但是这会产生这个错误:
undefined method `-' for nil:NilClass
有理想的方法吗?我应该在模型中使用某些东西吗?
答案 0 :(得分:1)
您可以在模型中创建实例方法。类似的东西:
# models/post.rb
def count_votes
(up || 0) - (down || 0) # "|| 0" because subtracting from `nil` will throw `nil:NilClass` error.
end
现在,您可以从视图中调用post.count_votes
以获得所需的结果。
答案 1 :(得分:1)
看起来像post.up_vote(以及post.down_vote)列的默认值是NULL。因此up_vote
失败了。
您可以将down_vote
和0
的默认值设为default
您可以在数据库级别添加此项,方法是在迁移中指定# post.rb
after_initialize :set_defaults
def set_defaults
self.up_vote = 0
self.down_vote = 0
end
或者,如果您不想触摸迁移,可以将其保持在模型级别,
例如:
{{1}}