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

通过第三次选择,我可以看出,这是唯一性验证失败!这就是 ROLLBACK 的原因。但这没有意义,当然DB中有这样的行,因为它是UPDATE动作。我该怎么办?我不想通过: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]

您应该检查给定的用户是否有效(您是否将他保存到数据库而不进行验证)。

于 2013-05-15T06:57:25.927 回答
2

在调用之前检查您的对象是否有效update_attributes

@user.valid?

我花了很长时间尝试调试类似的问题,却发现我的数据一开始就不好。它与 无关update_attributes。修改罪魁祸首数据库条目后,我的模型在调用后再次生效@user.find(id)并按update_attributes预期工作。

于 2013-10-08T14:15:57.730 回答