1

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

4

1 回答 1

6

是的,如果您已将 :validatable 传递给模型中的 devise 方法,Devise 确实会提供密码验证。密码长度的默认配置为 6..128。您可以在 config/initializers/devise.rb 中覆盖它(大约第 101 行)。

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

validates :password, :presence => true, :if => lambda { new_record? || !password.nil? }
于 2011-08-19T17:32:38.550 回答