验证update_attributes上缺少的属性

Rap*_*elo 1 validation devise update-attributes ruby-on-rails-3

问题很简单,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
Run Code Online (Sandbox Code Playgroud)

我在模型上定义了以下验证:

validates :password,
          :length => { :within => 6..40 }
Run Code Online (Sandbox Code Playgroud)

因此,每当我使用调用更新时,我都会收到一条错误消息,指出密码太短

Ps.:我正在使用Devise来解决这个问题.

编辑:你们有没有人知道如果Devise已经对密码进行了任何验证?因为,我删除了验证,它以正确的方式工作,但如果我输入一个简短的密码,它仍然显示验证,说它太短.

dog*_*unk 6

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

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

validates :password, :presence => true, :if => lambda { new_record? || !password.nil? }
Run Code Online (Sandbox Code Playgroud)