2

したがって、いくつかの単純なユーザー モデルと、パスワードを更新するためのフォームがあります。

@user.update_attributes(:password=>params[:password])

しかし、これはうまくいきませんでした。

User Load (1.0ms)  SELECT "users".* FROM "users" WHERE "users"."auth_token" = 'z7KU4I0IXLjiRMpdF6SOVQ' LIMIT 1
  User Load (0.0ms)  SELECT "users".* FROM "users" WHERE "users"."password_reset_token" = 'aMOjTN0ikPUOJo2JMVoDtQ' LIMIT 1
   (0.0ms)  BEGIN
  User Exists (1.0ms)  SELECT 1 AS one FROM "users" WHERE (LOWER("users"."email") = LOWER('somemail@mail.ru') AND "users"."id" != 1) LIMIT 1
   (0.0ms)  ROLLBACK
Redirected to http://localhost:3000/edit_user_by_reset?reset_token=aMOjTN0ikPUOJo2JMVoDtQ

3 番目の選択では、一意性の検証に失敗したことがわかります。それが ROLLBACK の理由です。もちろんUPDATEアクションであるため、DBにはそのような行があります。私は何をすべきか?ここはパスしたくない:validate=>false

4

2 に答える 2

2

パスワード フィールドのみを更新する場合は、 mass_assignment メソッドupdate_attributesを使用しないでくださいupdate_attribute(:password, params[:user][:password])

params[:password]ハッシュにエラーが発生する可能性があります。使用する場合は、他のフィールドに共通form_for @userする必要があります。params[:user][:password]params[:user]

指定されたユーザーが有効かどうかを確認する必要があります (検証せずに DB に保存しましたか)。

于 2013-05-15T06:57:25.927 に答える
2

を呼び出す前に、オブジェクトが有効であることを確認してくださいupdate_attributes

@user.valid?

同様の問題をデバッグしようとして長い時間を費やしましたが、最初からデータが悪いことがわかりました。とは関係ありませんでしたupdate_attributes。犯人 DB エントリを変更した後、私のモデルは呼び出し後に再び有効になり、期待どおりに機能@user.find(id)update_attributesました。

于 2013-10-08T14:15:57.730 に答える