0

我的 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
4

2 回答 2

6

这似乎更适合模型。我建议在模型中创建一个like方法,如下所示:

def like
    self.increment!(:votes)
end 

现在您可以执行以下操作:

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

注意:increment!,带感叹号的同时也执行保存动作

于 2012-08-10T16:51:26.983 回答
5

几件事。听起来您想要的是一个控制器动作,它将属性加一。您可能与代码最接近

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

如果您查看该方法的文档,它会将属性的值设置为第二个参数,即对象上votes的字符串,以及数据库中相应的行。您不想将其设置为,而是要将其设置为增量值:'1'@suggestion'1'

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

Ethan 建议使用方便的方法,递增!,它的工作原理是一样的。

现在,如果您想在每次保存对象时实际自动递增(如在其他有关对象被更改的情况下,您希望使用不带 bang的:before_save 回调increment

于 2012-08-10T17:06:48.793 回答