为什么将validate_password_field设置为false会禁用所有authlogic验证?

时间:2011-04-13 14:29:50

标签: ruby-on-rails validation passwords authlogic omniauth

我正在尝试允许用户使用Twitter等外部服务注册我的应用。因此,我不需要Authlogic尝试验证的用户模型的密码。因此,我正在禁用密码验证,如下所示:

acts_as_authentic
before_validation :update_authlogic_config
#In the case that the user has signed up with an omniauth service.
attr_accessor :needs_no_password
def update_authlogic_config     
    validate_password_field = !needs_no_password
end

这一切都运行良好,但它似乎也禁用了我想要保留的电子邮件/用户名验证。

因此,我更新了我的方法,以确保电子邮件字段验证如此:

def update_authlogic_config
   validate_password_field = !needs_no_password
   ignore_blank_passwords = needs_no_password
   validate_email_field = true
end

使用它会在密码验证中退回,给出以下错误:

  

密码太短(最低为4   人物)

     

密码确认是   太短(最少4个字符)

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您正在寻找的是一种简单地忽略密码验证的方法。这是一个称为渐进式参与的过程,最常用于创建用户帐户,但在用户真正需要它们进行更高级的系统操作之前,不需要特定的内容。您要做的是修改模型中的authlogic配置,如下所示:

acts_as_authentic do |c|
  c.merge_validates_confirmation_of_password_field_options({:unless => :networked?})
  c.merge_validates_length_of_password_field_options({:unless => :networked?})
  c.merge_validates_length_of_password_confirmation_field_options({:unless => :networked?})
end

def networked?
  self.authentications.any? # or true/false boolean of some kind
end

我从以下要点获得了这些信息:http://gist.github.com/436707/

答案 1 :(得分:0)

如果您没有将crypted_pa​​ssword字段放在用户模型中,则不会加载密码模块,因此验证将不会运行。

您会发现这是Authlogic中每个模块的常规行为。