Ruby on rails Rails在更新对象时验证唯一性?-很奇怪

Ruby on rails Rails在更新对象时验证唯一性?-很奇怪,ruby-on-rails,Ruby On Rails,所以,我有一些简单的用户模型和更新密码的表单 @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 "us

所以,我有一些简单的用户模型和更新密码的表单

@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
通过第三次选择,我可以看出,这是唯一性验证失败!这就是回滚的原因。
但这没有意义,当然数据库中有这样的行,因为它是更新操作。我该怎么办?我不想在这里通过
:validate=>false

如果只想更新密码字段,则不应使用批量分配方法
更新属性
,应使用
更新属性(:password,params[:user][:password])

您的
params[:password]
hash可能有错误:如果您使用@user的
form_,那么您应该使用
params[:user][:password]
和其他字段的公共
params[:user]


您应该检查给定用户是否有效(您是否未经验证就将其保存到数据库中)。

如果您只想更新密码字段,您不应该使用批量分配方法
更新属性
,您应该使用
更新属性(:password,params[:user][:password])

您的
params[:password]
hash可能有错误:如果您使用@user
form_,那么您应该使用
params[:user][:password]
和其他字段的公共
params[:user]


您应该检查给定的用户是否有效(您是否未经验证就将其保存到数据库中)。

在调用
更新属性之前检查对象是否有效

@user.valid?

我花了很长时间试图调试一个类似的问题,结果发现我的数据一开始就不好。它与更新属性无关。修改罪魁祸首数据库条目后,我的模型在调用
@user后再次生效。查找(id)
更新\u属性
按预期工作。

在调用
更新\u属性
之前检查对象是否有效

@user.valid?

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

至少有两个用户具有相同的电子邮件地址,一个id=1,另一个没有。重新阅读问题,很明显存在这样的用户,因为这是更新操作,它更新现有rowI断言用户的某些列。查找(1)。有效吗?将返回false。你认为“明显”是不正确的。查询正在查找具有相同电子邮件的其他用户(即具有不同id的用户)。至少有两个用户具有相同的电子邮件地址,一个id=1,另一个没有。请重新阅读问题,很明显存在这样的用户,因为这是更新操作,它会更新现有rowI的某些列,并断言该用户。查找(1)。有效吗?将返回false。你认为“明显”是不正确的。查询正在查找具有相同电子邮件的其他用户(即具有不同id的用户)。