Rails 6.0 在为一种用户创建和更新时验证密码是不是存在,但只为另一种用户更新

Posted

技术标签:

【中文标题】Rails 6.0 在为一种用户创建和更新时验证密码是不是存在,但只为另一种用户更新【英文标题】:Rails 6.0 validate password presence on create and update for one type of user but only update for anotherRails 6.0 在为一种用户创建和更新时验证密码是否存在,但只为另一种用户更新 【发布时间】:2021-07-17 00:13:33 【问题描述】:

我有一个具有以下属性的User 模型:

 id: integer
 username: string
 email: string
 password_hash: string
 password_salt: string
 account_type: string
 ...

我的目标是在创建和更新时验证用户的密码。

当创建或更新具有account_type: 'a' 的用户时,我想运行validates :password, :password_confirmation, presence: true

account_type: 'b' 的用户得到更新时,我想验证passwordpassword_confirmation 的存在是否为真,但不是在用户被创建时。

如果更多代码或更清晰的解释会有所帮助,请告诉我。提前致谢。

【问题讨论】:

所以对于用户 account_type b 不应该发生任何验证(至少关于存在?) 我想验证 account_type b 用户的密码是否存在,但仅在更新时,而不是在创建时。 "有时仅在满足给定谓词时才验证对象是有意义的。您可以使用 :if 和 :unless 选项来做到这一点,它们可以采用符号、Proc 或数组。当你想指定何时应该进行验证时,可以使用 :if 选项。如果你想指定何时不应该进行验证,那么你可以使用 :unless 选项。 guides.rubyonrails.org/… 【参考方案1】:
validates :password, :password_confirmation, presence: true, unless: ->  |user| user.account_type == 'b' && user.new_record? 

【讨论】:

你可以用user.new_record?代替on: :update guides.rubyonrails.org/active_record_validations.html#on @max 如果他想使用 on: :update 他会输掉 :create 案例,对吧?他至少不能使用一个班轮 啊,你是对的。它只会在更新时应用验证。 @Joel_Blum 确实有效!谢谢你们俩的帮助。

以上是关于Rails 6.0 在为一种用户创建和更新时验证密码是不是存在,但只为另一种用户更新的主要内容,如果未能解决你的问题,请参考以下文章

Rails omniauth Google - 如何更新个人资料数据

将另一个表中的数据显示为一种形式 - rails

Hadoop2.6.0安装—单机/伪分布

rails - 身份验证、授权和审计混淆

如何在2个服务器之间进行通用认证--Rails和Django

Jabber Openfire 服务器 v3.6.0a+ - 如何使用混合身份验证?