2010-08-22 90 views
19

我的用户模型包含:名称,电子邮件和密码字段。所有3个都有长度验证。 “更新帐户”网页允许用户更新他的姓名和电子邮件地址,但不是密码。提交时,params [:user]是在Rails 3中,当我不试图更新密码时,如何跳过验证密码字段?

{"name"=>"Joe User", "email"=>"[email protected]"} 

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

当我打电话

@user.update_attributes(params[:user]) 

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

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

谢谢。

+1

它不应该运行密码验证,并且如果密码字段有效首先关闭,它将失败。你说你没有通过密码,但我有你的怀疑。 – 2010-08-22 22:59:48

回答

27

我的应用程序是这样的

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的核查采取地方,你没有做到这一点在创建。

这一点我在一个良好的railscast发现在http://railscasts.com/episodes/41-conditional-validations

+0

谢谢你,mathepic。这对我有效。 – Sanjay 2010-08-22 21:23:04

+0

也许可以使用'password_changed?'帮助器? – 2012-10-16 22:59:34

+0

@PeterEhrlich在使用'has_secure_password'时会引发缺少的方法。你必须在'password_digest'上调用它,因为如果密码存在,它将被重新加密。 – Mohamad 2013-08-13 15:09:24

0

,我的工作就使用以下的应用:

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

根据您的要求,您可能要删除的new_record?检查

+0

这似乎是删除确认点 - 您不会确认他们是否没有在表单中指定确认。 – alternative 2010-08-22 19:50:13

+0

嗯...看起来像一个错误,你是对的。 – 2010-08-22 23:23:34

1

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

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

这会允许某人设置空密码吗? – Pete 2012-06-24 11:20:47

1

使用update_attributes如果在params哈希表没有任何键不会更改密码的值。

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

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

您可以使用您使用自定义方法验证的虚拟属性(实例变量或方法),然后将散列分配给存储的密码字段。看看this technique的想法。

0
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**