覆盖rails 3.1 has_secure_password中的password_digest验证

时间:2011-10-16 14:54:22

标签: ruby-on-rails-3.1

所以我希望在has_secure_password中允许空的password_digest,但是看看ActiveModel :: SecurePassword似乎是硬编码的:

validates_presence_of     :password_digest

覆盖这个的唯一方法是使用猴子补丁吗?

3 个答案:

答案 0 :(得分:0)

我认为has_secure_password不会像你发现的那样做你想做的事。

所以不是使用has_secure_password,你可以编写自己的,基本上复制源代码并“分叉”它来做你想做的事情 - 只有生成并验证密码如果#user不是nil,它听起来像你想。

或者,正如jtomasri建议的那样,你可以创建一个Employee模型和一个User模型 - 你可以使用ActiveRecord'单表继承'功能让它们仍然在同一个表中,并拥有一个共同的超类您仍然可以获取(比如,Account.find返回符合您条件的员工和用户)。在某些方面,这是“更清洁”的解决方案,虽然它增加了幕后ActiveRecord内容的复杂性 - 在过去单表继承有点错误,我认为他们表现得很好这些天。 (有一段时间没用过它)。

答案 1 :(得分:0)

我刚遇到一个相关问题,并使用:if运算符进行验证。

validates :password ,..., :if => :employee_needs_password?
validates :password_confirmation , ... , :if => :employee_needs_password?

def employee_needs_password?
   # check whatever your condition is and return true/false 
end

答案 2 :(得分:-1)

如果您想要一个空密码,为什么要包含has_secure_password;如果您接受空密码,为什么要实现密码呢?无论如何你总是可以实现自己的摘要方法而不使用BCrypt的has_secure_password,从头开始有一个Railscast#250身份验证,你可以看到这个在行动