【问题标题】:Is there a way in Rails to say "run all the validates EXCEPT :password"?Rails 中有没有办法说“运行所有验证,除了:密码”?
【发布时间】: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


    【解决方案1】:

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

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

    但我将其调整为手动(通过管理面板)邀请新的潜在用户使用我的应用。

    希望这会有所帮助!

    【讨论】:

    • 顺便说一句,如果我没记错的话,Devise 包含一个名为 skip_password! 的方法,因此您可以在 User 模型中覆盖您的注册方法并获得相同的结果。
    • 我想远离大多数设计的表格。我发现他们需要太多的专业化,我什至可能会在某个时候把它换掉。所以对于复杂的表单,我才开始自己编写方法。我可能会继续这个过程并最终将其换掉。原因是它最初为我节省了很多时间,但我发现弄清楚如何自定义它或按照我想要的方式调整它的时间比从头开始编写代码花费的时间更长。当然如果你用过5次Devise会更快,但是对于一个新用户来说……我不认为它到底是什么。
    • 无论如何,回到手头的任务...设计似乎没有包含skip_password!但它确实包含password_required?可以覆盖的方法。我想我将不得不创建这个方法并使用一个变量来配置它。
    • 自定义像 Devise 这样的 Rails 生成器并不难,它通常涉及覆盖所需的方法(又名 Monkey Patching en.wikipedia.org/wiki/Monkey_patch)。看看我在用户确认帐户时发送欢迎消息的示例:gist.github.com/982181
    猜你喜欢
    • 2019-04-22
    • 2019-12-16
    • 2021-01-14
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 2014-03-28
    • 1970-01-01
    • 2013-11-09
    相关资源
    最近更新 更多