我有一个带有密码属性的用户模型,它被保存为密码摘要。我想要做的是将编辑用户页面和编辑密码页面分开,这样管理员每次需要更改其他内容时都不需要输入密码。为此,我做了一个额外的动作/视图。
我的问题是,当我更新用户信息时,即使表单中没有密码字段,我也会收到密码验证错误。这使我得出的结论是 partial_updates 不适用于密码属性(因为我已经在控制台中测试过它已启用,并且确实如此)
这是我做错了什么,还是我应该以不同的方式处理这个问题?
我有一个带有密码属性的用户模型,它被保存为密码摘要。我想要做的是将编辑用户页面和编辑密码页面分开,这样管理员每次需要更改其他内容时都不需要输入密码。为此,我做了一个额外的动作/视图。
我的问题是,当我更新用户信息时,即使表单中没有密码字段,我也会收到密码验证错误。这使我得出的结论是 partial_updates 不适用于密码属性(因为我已经在控制台中测试过它已启用,并且确实如此)
这是我做错了什么,还是我应该以不同的方式处理这个问题?
只有在更改密码时才需要验证密码。如果未更改,password
则应跳过该字段的验证。
Railscasts.com第 41 集向您展示了如何做到这一点。
类似于@normalocity 提到的railscasts 方法,但不需要在控制器中设置伪属性,我们这样做(本质上取自restful_authentication):
attr_accessor :password
validates :password,
:length => { :minimum => 8 },
:confirmation => true,
:presence => true,
:if => :password_required?
def password_required?
password_digest.blank? || !password.blank?
end
基本上,我们假设如果password_digest
还没有设置(对于新记录),或者如果password
已经设置了伪属性,那么这意味着密码正在被更改并且必须运行验证。所以我们不需要updating_password
像在 railscasts 剧集中那样设置伪属性。