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的用户)。