2017-06-22 3 views
0

私は基本的なupvotingとdownvotingのシステムを作成しました。私はupvotesとdownvotesを追跡する1つのトラックを保持する列を持っています。私はこれらの列を(おそらくヘルパーの方法で)引いて、2つの間で投票の集計を表示する方法はありますか?Railsで2つの列を集計する最良の方法

私はヘルパーでこれを試してみました:

<% @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 %> 

module PostsHelper 
    def count_votes(up, down) 
    @total = (up-down) 
    return @total 
    end 
end 

Index.html.erb

しかし、それはこのエラーを得られます。

undefined method `-' for nil:NilClass 

が行うための理想的な方法はありますこの?モデルで何かを使うべきですか?

答えて

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を呼び出すことができます。

+0

恐ろしいです!ありがとうございました。だから、ヘルパーではなくモデルでこれを行うことをお勧めしますか? – tfantina

+1

はい。モデルに属している必要があります。 –

1

post.up_vote(およびpost.down_vote)カラムのデフォルト値がNULLのようです。したがって、@total = (up-down)は失敗しています。あなたは、移行 でdefaultを指定することで、データベースレベルでこれを追加するか、またはそうでない場合は、モデルレベルでそれを維持することができます

0として

あなたはup_votedown_voteのデフォルト値を持つことによってこの問題を解決することができます移行に手を加えたい、 例:

# post.rb 
after_initialize :set_defaults 

def set_defaults 
    self.up_vote = 0 
    self.down_vote = 0 
end 
関連する問題