我正在使用Devise进行身份验证。如果未设置hashed_password
,Rails/Devise的验证将需要设置密码以及password_confirmation
。Rails中有没有一种方法可以说“运行所有验证除外:密码”?
当我邀请新用户时,我显然不想设置他们的密码,所以当我在我的系统中创建邀请时,它因为user.password
为空而失败。
我可以在用户设置的临时hashed_password
,但是当他们进入自己的密码,因为hashed_password
设置,这是一个真正的问题将不会发生:password
和:password_confirmation
验证检查。
有什么办法可以告诉Rails我想运行除:password
以外的所有验证吗?
我知道Rails有:if
的条件,这可能会解决我的问题,但Devise声明代表我的验证:password
,所以基本上是隐藏的。
我怎样才能在这里得到所需的结果?希望在一种不是黑客的方式。
我目前的假设解决方案有点麻烦:我唯一能想到的是创建一个不是用户模型的新邀请模型,并使用表单的邀请模型。提交邀请时,我可以验证该邀请并将所有值复制到新的用户模型。我可以保存该用户而没有任何验证。
这是我梦寐以求的最佳解决方案。
这似乎是我的解决方案会比说一些简单的像很多工作:
user.save(validations => {:except => :password})
编辑:我已经找到了解决方案的一个组成部分,但我仍然有问题。在我们的用户模型,我们可以覆盖设计方法,以防止密码的验证与此位的代码邀请:
#protected
def password_required?
!is_invited && super
end
的is_invited
属性就是我加入users
表/模型列。
但是,这里有一个问题。当用户接受邀请并且他们到达需要设置其密码/密码确认的表单时,valid?
将总是返回true
。
这一个让我深感困惑。我没有看到requires_password?
和valid?
如何可以在同一时间。如果它需要密码,它应该进行验证检查并导致验证失败。
我开始讨厌Devise - 或者只是使用宝石在黑匣子中构建应用程序的一部分的想法。我认为真正的解决方案可能是摒弃Devise,只是从头开始。这样,你的应用程序拥有这一切是如何工作:(
顺便说一句,如果我记得很清楚制定包括一种称为skip_password! ,所以你可以重写y我们的注册方法在您的用户模型中并且达到相同的结果。 – 2011-05-24 04:31:27
我想远离大部分的设计形式。我发现他们需要太多专业化,我甚至可能在某个时候将其交换出去。所以对于复杂的表格,我自己就开始写这些方法。我可能会继续这个过程并最终将其交换出去。原因在于,尽可能多的时间节省了我最初的时间,我发现如何定制或按照我想要的方式调整它需要的时间比从头开始编写代码要花费更多的时间。当然,如果你使用Devise 5次,速度会更快,但是对于新用户...我不认为它到头了。 – 2011-05-24 10:35:11
无论如何,回到手边的任务......设计似乎没有包含skip_password !,但它包含password_required?可以覆盖的方法。我想我将不得不创建这个方法并使用一个变量来配置它。 – 2011-05-24 10:39:06