2013-06-25 41 views
2

我在Rails應用程序的Microphoto模型中有兩個額外的整數字段,:votes_up:votes_down。我沒有在數據庫中手動設置任何初始值。update_attribute'undefined method'+'for nil:NilClass'

這是在我的控制器:

def vote_up 
    @microphoto = Microphoto.find(params[:id]) 
    @microphoto.update_attribute(:votes_up, @microphoto.votes_up + 1) 
    redirect_to root_path 
    end 

    def vote_down 
    @microphoto = Microphoto.find(params[:id]) 
    @microphoto.update_attribute(:votes_down, @microphoto.votes_down + 1) 
    redirect_to root_path 
    end 

,這是我的觀點:

<%= link_to "vote up", vote_up_microphotos_url(feed_item.id), :method => :put %> 
<%= link_to "vote down", vote_down_microphotos_url(feed_item.id), :method => :put %> 

,但是,當我點擊例如,投了鏈接,它給我的錯誤:

NoMethodError in MicrophotosController#vote_up 
undefined method `+' for nil:NilClass 

我認爲應該有一個問題,使用update_attribute。我的一位朋友也提到,問題可能是由於字段中未設置的0的初始值所致。

修訂

另一個問題,必須有一個錯字,但我不能找到它。 votes_up鏈接正常工作並正確呈現,但票數不是! uninitialized constant MicrophotosController::O

+0

,我相信你的朋友可能是正確的。如果該字段沒有默認值,那麼您將嘗試添加'nil + 1',這會導致您收到的錯誤。你可以在遷移或'new'方法中設置初始值。 –

+2

試試這個:'(@ microphoto.votes_up || 0)+ 1'這意味着如果'@ microphoto.votes_up'爲零(不等於零,沒有默認值),它將使用0代替 – MrYoshiji

回答

2

這裏的問題是您的屬性votes_up的實例@microphotonil

幾種方法可以解決這個

#1:設置默認值的屬性votes_upafter_create回調:

class Microphoto < ActiveRecord::Base 

    after_create :set_defaults 
    #... 

    def set_defaults 
    self.votes_up = 0 
    self.votes_down = 0 
    self.save 
    end 

#2:使用零如果votes_up是nil

nil || 10 #=> returns 10 (try it in your console!) 
# in your case: 
(@microphoto.votes_up || 0) + 1 
# the full line: 
@microphoto.update_attribute(:votes_up, (@microphoto.votes_up || 0) + 1) 

要顯示票了&下的總數,在你的節目的動作,你可以做這樣的事情:

#in controller 
def show 
    @microphoto = Microphoto.find(params[:id]) 
end 

#in view 
Total of votes up: <%= @microphoto.votes_up %> 
Total of votes down: <%= @microphoto.votes_down %> 
<%= link_to "vote up", vote_up_microphotos_url(feed_item.id), :method => :put %> 
<%= link_to "vote down", vote_down_microphotos_url(feed_item.id), :method => :put %> 
+0

感謝您的回答。請問我怎麼才能渲染結果數的votes_up和votes_down,在我看來?我是一個新手 – Trix

+0

沒問題,給我第二個更新我的回答 – MrYoshiji

+0

@Arash我剛更新了我的答案,讓我知道如果你需要別的東西! – MrYoshiji

0

如果您只是將initialize方法中的votes_upvotes_down的值設置爲0,那麼您的代碼應該可以工作。您可能還需要使用默認值更新數據庫。

相關問題