1. ホーム
  2. ruby-on-rails

[解決済み] Railsの場合。コールバックを使わずにモデルの属性を更新する

2023-05-26 04:15:20

質問

私は、:credits属性を持っているユーザーモデルを持っています。 私は、ユーザーのクレジットに5を追加する簡単なボタンが欲しいのですが、"add"というルートを通して、/users/3/addがユーザーID = 3のクレジットに5を追加するようにします。

def add
    @user = User.find(params[:id])
    @user.credits += 5
    redirect_to root_path
end

これが私のコントローラの関連部分です。 問題は、現在のUTC時間に基づいてユーザーのパスワードを再暗号化するbefore_saveコールバックがあるため、@user.saveを呼びたくないということです。 私は単に属性に5を追加し、コールバックを回避したいだけです。このような単純なことがこんなに難しいとは思いませんでした。

EDITです。

コールバックを:before_createに変更しました。 以下は新しいコントローラのコードです(関連する部分)。

  def add
    @user = User.find(params[:id])
    @user.add_credits(5)
    @user.save
    flash[:success] = "Credits added!"
    redirect_to root_path
  end

そして、これがモデル内の私のコードです。

 def add_credits(num)
    self.credits = num
 end

EDIT 2:

OK、それは "EDIT" の変更を機能させないバリデーションの問題でした。

どのように解決するのですか?

Rails 3.1導入 update_column と同じです。 update_attribute と同じですが、バリデーションやコールバックのトリガーがありません。

http://apidock.com/rails/ActiveRecord/Persistence/update_column