我在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 :(得分:6)
这似乎更适合模型。我建议在模型中创建一个like
方法,如下所示:
def like
self.increment!(:votes)
end
现在你可以这样做:
@suggestion = Suggestion.find(params[:id])
@suggestion.like
注意:增量!,感叹号也执行保存操作
答案 1 :(得分:5)
一些事情。听起来你想要的是一个控制器动作,它将属性增加一个。你可能最接近代码
@suggestion.update_attribute(:votes, '1')
如果您检查该方法的documentation,则会将属性votes
的值设置为对象上的第二个参数字符串'1'
,@suggestion
,及其在数据库中的相应行。您希望将其设置为递增的值,而不是将其设置为'1'
:
@suggestion.update_attribute(:votes, @suggestion.votes + 1)
Ethan建议使用方便的方法increment!,它的工作原理相同。
现在,如果你想在每次保存对象时实际自动增加(就像对象的其他内容被更改一样),你需要:before_save
callback使用{{ 1}} without the bang。