我正在使用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并从头开始做。这样你的应用程序可以完全控制所有这些工作:(
答案 0 :(得分:0)
我最近开始使用这个很棒的设计插件:devise_invitable
它通常被使用,因此用户(或任何模型)可以邀请其他用户加入。
但我会手动调整它(通过管理面板)邀请新的潜在用户访问我的应用。
希望这有帮助!