【发布时间】:2011-08-31 14:04:09
【问题描述】:
我正在使用 Devise 进行身份验证。如果未设置 hashed_password,Rails/Devise 的验证将需要设置密码以及 password_confirmation。
当我邀请新用户时,我显然不想设置他们的密码,所以当我在我的系统中创建邀请时,它会失败,因为user.password 是空白的。
我可以在用户上设置一个临时的hashed_password,但是当他们输入自己的密码时,:password 和:password_confirmation 的验证检查将不会发生,因为设置了hashed_password,这是一个真正的问题。
有什么方法可以告诉 Rails 我要运行所有验证,除了与 :password 关联的验证?
我知道 Rails 有 :if 条件,这可能会解决我的问题,但 Devise 代表我声明了 :password 验证,因此基本上是隐藏的。
我怎样才能在这里得到想要的结果?,希望以一种不是黑客的方式。
我目前假设的解决方案有点混乱:我唯一能想到的就是创建一个不是 User 模型的新 Invitation 模型,并为表单使用 Invitation 模型。提交邀请后,我可以验证该邀请并将所有值复制到新的用户模型中。我可以在没有任何验证的情况下保存该用户。
这是我梦寐以求的最佳解决方案。
看来我的解决方案比说简单的话要多得多:
user.save(validations => {:except => :password})
编辑:我找到了解决方案的一部分,但我仍然遇到问题。在我们的用户模型中,我们可以重写一个 Devise 方法,以防止使用以下代码验证邀请密码:
#protected
def password_required?
!is_invited && super
end
is_invited 属性只是我添加到users 表/模型中的一列。
但是,这里有一个问题。当用户接受邀请并到达需要设置密码/密码确认的表单时,valid? 将始终返回true。
这件事让我深感困惑。我看不出requires_password? 和valid? 如何同时为真。如果它需要密码,它应该进行验证检查并导致验证失败。
我开始讨厌 Devise - 或者只是讨厌使用 gem 在黑盒中构建应用程序的一部分的想法。我认为真正的解决方案可能是去掉 Devise 并从头开始做这一切。这样,您的应用就可以完全控制所有这些工作的方式:(
【问题讨论】:
标签: ruby-on-rails ruby validation passwords devise