dan*_*mcc 0 controller increment save ruby-on-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
Run Code Online (Sandbox Code Playgroud)
它正在工作,但不是更新当前的建议,而是更新所有建议.所以我改成了:
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
Run Code Online (Sandbox Code Playgroud)
但后来我得到:
undefined method `update_all' for #<Suggestion:0x007f87c2b918a0>
Run Code Online (Sandbox Code Playgroud)
所以然后我尝试了@suggestion.update_attribute(:votes, '1')但是将值重置为1而不是递增它.
实现这一目标的正确方法是什么?我只想让当前建议的整数(投票)在每次保存时增加/减少1.
我也试过以下没有运气:
def like
@suggestion = Suggestion.find(params[:id])
@suggestion.increment(:votes)
redirect_to suggestions_url
end
Run Code Online (Sandbox Code Playgroud)
这似乎更适合模型.我建议like在模型中创建一个方法,如下所示:
def like
self.increment!(:votes)
end
Run Code Online (Sandbox Code Playgroud)
现在你可以这样做:
@suggestion = Suggestion.find(params[:id])
@suggestion.like
Run Code Online (Sandbox Code Playgroud)
注意:increment!,感叹号也执行保存操作
几件事.听起来你想要的是一个控制器动作,它将属性增加一个.你可能最接近代码
@suggestion.update_attribute(:votes, '1')
Run Code Online (Sandbox Code Playgroud)
如果检查该方法的文档,则会将该属性的值设置为votes第二个参数,'1'对象上的字符串@suggestion,以及数据库中的相应行.'1'您希望将其设置为递增值,而不是将其设置为:
@suggestion.update_attribute(:votes, @suggestion.votes + 1)
Run Code Online (Sandbox Code Playgroud)
Ethan建议使用方便的方法,增加!,工作原理相同.
现在,如果你每一个对象被保存的时间(如在其他关于对象的东西要真正自动递增被改变,你要使用的:before_save 回调有increment 没有爆炸.