在Rails中有没有办法说“运行所有验证除外:密码”?

时间:2011-05-24 01:39:25

标签: ruby-on-rails ruby validation passwords devise

我正在使用Devise进行身份验证。如果未设置hashed_password,则Rails / Devise的验证将需要设置密码,以及password_confirmation

当我邀请新用户时,我显然不想设置他们的密码,因此当我在系统中创建邀请时,它会失败,因为user.password为空。

我可以为用户设置临时hashed_password,但是当他们输入自己的密码时,:password:password_confirmation的验证检查不会发生,因为hashed_password是设置,这是一个真正的问题。

有没有办法告诉Rails我想运行除:password之外的所有验证?

我知道Rails有:if个条件,这可能会解决我的问题,但是Devise代表我声明:password验证,因此基本上是隐藏的。

我怎样才能在这里获得所需的结果?希望以一种不是黑客的方式。

我当前的假设解决方案有些混乱:我唯一能想到的是创建一个不是用户模型的新邀请模型,并使用表单的邀请模型。提交邀请后,我可以验证邀请并将所有值复制到新用户模型。我可以保存该用户而不进行任何验证。

这是我梦寐以求的最佳解决方案。

似乎我的解决方案比说简单的事情要多得多:

user.save(validations => {:except => :password})

编辑:我找到了解决方案的一部分,但我仍然遇到问题。在我们的用户模型中,我们可以覆盖Devise方法,以防止使用以下代码验证邀请密码:

#protected
def password_required?
  !is_invited && super
end

is_invited属性只是我添加到users表/模型的列。

然而,这里有一个问题。当用户接受邀请并且他们到达需要设置密码/密码确认的表单时,valid?始终返回true

这个让我深感困惑。我没有看到requires_password?valid?同时如何成真。如果需要密码,则应进行验证检查并使验证失败。

我开始讨厌Devise - 或者只是想用gems在blackbox中构建应用程序的一部分。我认为真正的解决方案可能是撕掉Devise并从头开始做。这样你的应用程序可以完全控制所有这些工作:(

1 个答案:

答案 0 :(得分:0)

我最近开始使用这个很棒的设计插件:devise_invitable

它通常被使用,因此用户(或任何模型)可以邀请其他用户加入。

但我会手动调整它(通过管理面板)邀请新的潜在用户访问我的应用。

希望这有帮助!