0

Rails3アプリケーションに次のコードがあります。

 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

いくつかのこと。必要なのは、属性を1つインクリメントするコントローラーアクションのようです。あなたはおそらくコードに最も近いでしょう

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

そのメソッドのドキュメントを確認すると、属性の値が2番目の引数であるオブジェクトvotesの文字列、、およびデータベース内の対応する行に設定されます。に設定する代わりに、増分値に設定します。'1'@suggestion'1'

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

イーサンは便利な方法を使用することを提案しました、増分!、これはまったく同じように機能します。

ここで、オブジェクトが保存されるたびに実際に自動インクリメントしたい場合(オブジェクトに関する他の何かが変更された場合のように、bangなしで:before_save コールバックを使用する必要があります) 。increment

于 2012-08-10T17:06:48.793 に答える