2017-06-22 4 views
0

Ich habe ein grundlegendes Upvoting und Downvoting-System in Schienen erstellt. Ich habe eine Spalte, die Upvotes verfolgt, und eine, die die Downvotes verfolgt. Gibt es eine Möglichkeit, diese Spalten zu subtrahieren (vielleicht als Helfer), um die Anzahl der Stimmen zwischen den beiden zu zeigen?Der beste Weg, um zwei Spalten in Rails zu vergleichen

Ich habe versucht, dies mit einem Helfer:

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

Aber das ergibt diesen Fehler:

undefined method `-' for nil:NilClass 

Gibt es eine ideale Möglichkeit, zu tun Dies? Sollte ich etwas im Modell verwenden?

Antwort

1

Sie können eine Instanzmethode im Modell erstellen. Etwas wie:

# models/post.rb 

    def count_votes 
    (up || 0) - (down || 0) # "|| 0" because subtracting from `nil` will throw `nil:NilClass` error. 
    end 

Jetzt können Sie post.count_votes aus Sicht aufrufen, das gewünschte Ergebnis zu erhalten.

+0

Super! Vielen Dank. Also empfiehlst du das im Modell anstatt als Helfer? – tfantina

+1

Ja. Es sollte zum Modell gehören. –

1

Scheint wie Standardwert für post.up_vote (und auch post.down_vote) Spalten ist NULL. Daher schlägt @total = (up-down) fehl.

Sie können dieses Problem beheben, indem Standardwert für up_vote mit und down_vote als 0

Sie entweder diese auf Datenbankebene hinzufügen, indem default in Migration Angabe oder Sie können es auf Modellebene halten, wenn Sie nicht tun möchten Migrationen zu berühren, Beispiel:

# post.rb 
after_initialize :set_defaults 

def set_defaults 
    self.up_vote = 0 
    self.down_vote = 0 
end 
Verwandte Themen