在Rails 3中,当我不尝试更新密码时,如何跳过密码字段的validation?

我的用户模型包含:name,:email和:password字段。 所有3个都有长度validation。 “更新帐户”网页允许用户更新其姓名和电子邮件地址,但不能更新密码。 提交时,params [:user]是

{"name"=>"Joe User", "email"=>"user@example.com"} 

请注意,没有“密码”键,因为表单不包含此类输入字段。

我打电话的时候

 @user.update_attributes(params[:user]) 

密码validation失败。 但是,由于我没有尝试更新密码,因此我不希望在此更新上运行密码validation。 当params [:user]不包含“password”键时,我很困惑为什么密码validation正在运行。

请注意,我希望在其他地方有一个单独的网页,允许用户更新他的密码。 对于该提交,密码validation应该运行。

谢谢。

我的应用程序做了这样的事情

 attr_accessor :updating_password validates_confirmation_of :password, :if => should_validate_password? def should_validate_password? updating_password || new_record? end 

所以你必须对model.updating_password = true进行validation,而你不必在创建时执行此操作。

我在http://railscasts.com/episodes/41-conditional-validations的良好railscast中找到了这个

在您的用户模型中,如果未设置密码validation,则可以忽略密码validation。

 validates_length_of :password, :minimum => N, :unless => lambda {|u| u.password.nil? } 

如果在params散列中没有密钥,则使用update_attributes不会更改密码的值。

validation不会仅针对更改的字段运行。 它也validation了现有的值。

您的validation必须失败,因为密码字段包含已保存在数据库中的某些无效内容。 我猜这可能是因为你在validation后对它进行哈希处理,并且你正在尝试validation哈希字符串。

您可以使用通过自定义方法validation的虚拟属性(实例变量或方法),然后将哈希值分配给存储的密码字段。 看看这个技巧的想法。

我正在处理的应用程序使用以下内容:

  validates_confirmation_of :password, :if => Proc.new { |account| !account.password.blank? || !account.password_confirmation.blank? || account.new_record? } 

根据您的要求,您可能想要删除new_record? 校验

 When password is added then only confirmation will be called and presence will call on create action only **validates_presence_of :password, :on =>:create** **validates_confirmation_of :password**