验证update_attributes上缺少的属性

时间:2011-08-19 13:07:01

标签: ruby-on-rails-3 validation devise update-attributes

问题很简单,即使我不想更新某些属性,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是否已对密码进行任何验证?因为,我删除了验证并且它以正确的方式工作,但是如果我输入一个简短的密码,它仍然显示验证,说它太短了。

1 个答案:

答案 0 :(得分:6)

是的,如果您已通过,Devise会提供密码验证:可验证模型中的设计方法。密码长度的默认配置为6..128。您可以在config / initializers / devise.rb(第101行)中覆盖它。

您可以删除:从您的模型中验证并根据您的喜好编写自己的验证。如果您这样做并且如果密码未传递给update_attributes则不希望运行验证,那么执行以下操作:

validates :password, :presence => true, :if => lambda { new_record? || !password.nil? }