2012-08-10 25 views
0

我有下面的代碼在我的Rails 3應用程序:保存在Rails 3中的遞增整數?

def like 
    @suggestion = Suggestion.find(params[:id]) 
    Suggestion.update_all("votes = (votes + 1)") 
    redirect_to suggestions_url 
    end 

    def dislike 
    @suggestion = Suggestion.find(params[:id]) 
    Suggestion.update_all("votes = (votes - 1)") 
    redirect_to suggestions_url 
    end 

它的工作,但不是更新當前建議,它更新了他們。所以,我把它改爲:

def like 
    @suggestion = Suggestion.find(params[:id]) 
    @suggestion.update_all("votes = (votes + 1)") 
    redirect_to suggestions_url 
    end 

    def dislike 
    @suggestion = Suggestion.find(params[:id]) 
    @suggestion.update_all("votes = (votes - 1)") 
    redirect_to suggestions_url 
    end 

但後來我得到:

undefined method `update_all' for #<Suggestion:0x007f87c2b918a0> 

於是我試着@suggestion.update_attribute(:votes, '1')但該值重置爲1,而不是增加它的。

實現此目標的正確方法是什麼?我只想讓當前建議的整數(票數)在每次保存時增加/減少1。

我也試過,沒有運氣以下:

def like 
@suggestion = Suggestion.find(params[:id]) 
@suggestion.increment(:votes) 
redirect_to suggestions_url 
end 
+0

建議是 @suggestion is the object – 2012-08-10 16:59:22

回答

5

有幾件事。這聽起來像你想要的是一個控制器的行動,增加一個屬性。你很可能是最接近的代碼

@suggestion.update_attribute(:votes, '1') 

如果您檢查documentation該方法,設置屬性votes到第二arguement值,字符串'1',在對象上,@suggestion,其對應的行在數據庫中。相反,它設置爲'1'的,你想將其設置爲增加後的值:

@suggestion.update_attribute(:votes, @suggestion.votes + 1) 

伊森用方便的方法,increment!,它的工作原理一樣的建議。現在

,如果每一個對象被保存的時間(如在其他關於對象的東西要真正自動遞增被改變,你會想用:before_savecallbackincrementwithout the bang

+0

謝謝你的解釋! – dannymcc 2012-08-10 17:18:57

+0

我已經改變了我接受的答案,這個純粹是因爲解釋幫助我比原來的答案更多,再次感謝。 – dannymcc 2012-08-10 17:44:41

6

這似乎更適合在模型中。我建議創建一個like方法的模型裏面,像這樣:

def like 
    self.increment!(:votes) 
end 

現在你可以做這樣的事情:

@suggestion = Suggestion.find(params[:id]) 
@suggestion.like 

注:增量與!感嘆號也執行保存操作

+0

完美,謝謝! – dannymcc 2012-08-10 17:02:08