Ruby on rails Rails中有没有一种方式可以说;运行所有验证,除了:password";?
我正在使用Desive进行身份验证。如果未设置Ruby on rails Rails中有没有一种方式可以说;运行所有验证,除了:password";?,ruby-on-rails,ruby,validation,passwords,devise,Ruby On Rails,Ruby,Validation,Passwords,Devise,我正在使用Desive进行身份验证。如果未设置哈希密码,Rails/Desive的验证将需要设置密码以及密码确认 当我邀请新用户时,我显然不想设置他们的密码,因此当我在系统中创建邀请时,邀请失败,因为user.password为空 我可以在用户身上设置一个临时的hash_密码,但是当他们输入自己的密码时,:password和:password_confirmation的验证检查将不会发生,因为设置了hash_密码,这是一个真正的问题 有没有办法告诉Rails我想运行所有的验证,除了与:passw
哈希密码
,Rails/Desive的验证将需要设置密码以及密码确认
当我邀请新用户时,我显然不想设置他们的密码,因此当我在系统中创建邀请时,邀请失败,因为user.password
为空
我可以在用户身上设置一个临时的hash_密码
,但是当他们输入自己的密码时,:password
和:password_confirmation
的验证检查将不会发生,因为设置了hash_密码
,这是一个真正的问题
有没有办法告诉Rails我想运行所有的验证,除了与:password
相关的验证
我知道Rails有:if
条件,这可能会解决我的问题,但是Desive代表我声明了:password
验证,因此基本上是隐藏的
我怎样才能在这里得到想要的结果呢?希望以一种不是黑客的方式
我目前假设的解决方案有点混乱:我唯一能想到的是创建一个新的邀请模型,而不是用户模型,并将邀请模型用于表单。提交邀请后,我可以验证该邀请并将所有值复制到新用户模型。我可以保存该用户而无需任何验证
这是我想出的最好的解决办法
看起来我的解决方案比简单的说一些话要复杂得多,比如:
user.save(validations => {:except => :password})
编辑:我找到了解决方案的一部分,但仍然存在问题。在我们的用户模型中,我们可以覆盖Desive方法,以防止使用以下代码位验证邀请密码:
#protected
def password_required?
!is_invited && super
end
is\u invested
属性只是添加到users
表/模型中的一列
然而,这里有一个问题。当用户接受邀请并到达需要设置密码/密码确认的表单时,valid?
将始终返回true
这件事使我深感困惑。我不明白如何要求密码?
和有效?
可以同时为真。如果需要密码,它应该执行验证检查并导致验证失败
我开始讨厌Desive——或者仅仅是使用gems在黑盒中构建应用程序的一部分。我认为真正的解决办法可能是拆掉这个设计,从头开始。这样,您的应用程序就可以完全控制所有这些工作方式:(我最近开始使用这个伟大的Desive附加组件: 它通常用于用户(或任何模型)可以邀请其他用户加入 但我将其改为手动(通过管理面板)邀请新的潜在用户加入我的应用程序
希望这有帮助!我最近开始使用这个很棒的Desive附加组件: 它通常用于用户(或任何模型)可以邀请其他用户加入 但我将其改为手动(通过管理面板)邀请新的潜在用户加入我的应用程序
希望这有帮助!顺便说一句,如果我记得很清楚的话,Desive会包含一个名为skip_password!的方法,这样你就可以在你的用户模型中覆盖你的注册方法并获得相同的结果。我想远离Desive的大多数表单。我发现它们需要太多的专门化,甚至可能在某个时候会将其替换掉。因此对于complex forms,我刚开始自己编写方法。我可能会继续这个过程,并最终将其替换掉。原因是,它在最初为我节省大量时间的同时,我发现,找出如何自定义它或以我想要的方式调整它的时间要比从头开始编写代码的时间长。当然,如果您使用了Desive 5次,它会会更快,但对于新用户…我不认为它最终是。无论如何,回到手头的任务…Desive似乎没有包含skip_密码!但它确实包含了一个可以覆盖的password_required?方法。我想我必须创建此方法并使用变量来配置它。像Desive这样定制rails生成器是不可能的那么难,它通常涉及覆盖所需的方法(也称为猴子补丁)。请看我为用户确认其帐户时发送欢迎消息而制作的示例:顺便说一句,如果我记得很清楚,Desive包含一个名为skip_password!的方法,因此您可以在用户模型中覆盖您的注册方法并获得相同的结果。我想远离Desive的大多数表单。我发现它们需要太多sp专业化,我甚至可能在某个时候交换它。所以对于复杂的表单,我只是开始自己编写方法。我可能会继续这个过程,并最终交换它。原因是,它一开始为我节省了很多时间,但我发现,找出如何自定义它或以我想要的方式调整它的时间比写的时间要长从头开始编写代码。当然,如果您使用Deviate 5次,速度会更快,但对于新用户来说…我不认为最终会这样。无论如何,回到手头的任务…Deviate似乎没有包含跳过密码!但它确实包含一个可以覆盖的密码?方法。我想我必须创建此方法并使用变量来配置它。定制像Deviate这样的rails生成器并不是那么难,它通常涉及覆盖所需的方法(也称为Monkey Patching)。请看我为用户确认其帐户时发送欢迎消息而制作的示例: