2

管理コントローラー (ユーザーコントローラーではない) からユーザーモデルの単一の属性を更新しようとしています。

これを行っている間、私は試しupdate_attribute()ましたが、ユーザーのパスワードも変更していました。

パスワードをハッシュするユーザーモデルに before_save メソッドがあるため、パスワードが変更されていると思います。

update_attributes()パスワードの検証をチェックしているため、機能していませんpresence=>true

これを達成する方法はありますか?

4

5 に答える 5

1

オプションを使用して、検証に条件を設定でき:ifます。私のコードでは、次のようになります。

validates :password,
          :length => { :minimum => 8 },
          :confirmation => true,
          :presence => true,
          :if => :password_required?


def password_required?
  crypted_password.blank? || password.present?
end

したがって、基本的には、データベース内の が設定されていない場合 (新しいレコードが作成されていることを意味します)、または検証が実行されるのは、新しいレコードが提供されているcrypted_password場合のみです。password

于 2012-04-10T13:41:30.037 に答える
0

ActiveRecordには、検証とコールバックの両方をスキップする「update-column」メソッドがあります。

http://api.rubyonrails.org/classes/ActiveRecord/Persistence.html#method-i-update_column

ただし、それは危険である可能性があることをお勧めします-理由のために:before_saveフィルターがあります。特定の場合に回避するために:exceptメソッドをフィルターに配置すると、再利用可能になるだけでなく、動作の一貫性を維持し、モデルの検証/コールバックスタックをバイパスするメソッドがコントローラーに埋め込まれるのを回避できます。

私は個人的に、Models内の保護されたメソッドを除いて、 update_columnのようなメソッドをどこでも見たいとは思っていません。

于 2012-04-10T13:16:43.877 に答える
0

試してみてくださいupdate_column(name, value)、それはうまくいくかもしれません。

于 2012-04-10T13:00:42.353 に答える
0

試す :

コールバックと検証をバイパスするには、次を使用します。

User.update_all({:field_name => value},{:id => 1})

お知らせしたいだけです:

  • Rails では、update_attribute メソッドはモデルの検証をバイパスしますが、update_attributes と update_attributes! 保存しようとしているレコードが有効でない場合、失敗します (それぞれ false を返すか、例外を発生させます)。

  • 2 つの違いは、update_attribute が save(false) を使用することです。一方、update_attributes は save を使用するか、save(true) と言うことができます。

于 2012-04-10T13:37:58.567 に答える
0

このようにユーザーの単一の属性を更新できます

@user is that user whose attribute you want to update

例: user_name

       @user.update_attributes(:user_name => "federe")

試してみると、1 つの属性のみが更新されます。

于 2012-04-10T12:58:42.937 に答える