问题很简单,即使我不想更新某些属性,update_attributes是否会验证模型的每个可能的验证?
我有一个编辑视图,用户可能会在其中更改密码,但只有在他通过密码时才会更改密码,即如果密码不会更改密码。
所以我在控制器中执行以下操作:
def update
params[resource_name].delete(:password) if params[resource_name][:password].blank?
params[resource_name].delete(:password_confirmation) if params[resource_name][:password_confirmation].blank?
params[resource_name].delete(:current_password) if params[resource_name][:current_password].blank?
if resource.update_attributes(params[resource_name])
...
end
end
我在模型上定义了以下验证:
validates :password,
:length => { :within => 6..40 }
因此,每当我使用调用更新时,我都会收到错误消息,说明密码太短
Ps。:我正在使用Devise来解决这个问题。
编辑:您是否知道Devise是否已对密码进行任何验证?因为,我删除了验证并且它以正确的方式工作,但是如果我输入一个简短的密码,它仍然显示验证,说它太短了。
答案 0 :(得分:6)
是的,如果您已通过,Devise会提供密码验证:可验证模型中的设计方法。密码长度的默认配置为6..128。您可以在config / initializers / devise.rb(第101行)中覆盖它。
您可以删除:从您的模型中验证并根据您的喜好编写自己的验证。如果您这样做并且如果密码未传递给update_attributes则不希望运行验证,那么执行以下操作:
validates :password, :presence => true, :if => lambda { new_record? || !password.nil? }