【问题标题】:How to validate some model attributes later以后如何验证一些模型属性
【发布时间】:2025-11-28 12:45:02
【问题描述】:

我有一个由Devise 创建的User 模型,创建后,我添加了一些额外的属性:username, age, year, gender 和我自己的验证...

问题是我想要一个页面来将自己注册为用户,并要求您提供用户名、电子邮件和密码。

一旦您注册,就会有一个页面Profile,您可以在其中完成其余信息。例如,它将具有您的telephone numberfirst name。你可以放不放。但如果你放了一些东西,它会验证。如果为空,则不会对该模型的该属性执行任何编辑,然后将执行 NO VALIDATION

两个页面都处理同一个模型,但会在不同的时刻添加信息。

当您尝试在注册页面中注册用户时,就会出现问题。 Rails 会抱怨,因为我没有提供的其他属性正在由模型验证(当我不希望模型验证它们时,至少对于那个页面)。

我如何确定每个时刻验证的内容?

【问题讨论】:

    标签: ruby-on-rails model devise rails-activerecord


    【解决方案1】:

    如果添加它们总是可选的,那么您可以进行条件验证

    validates :first_name, presence: true, if: :first_name?
    

    如果您只想在创建后验证它们,您可以使用 on

    validates :first_name, presence: true, on: :update
    

    【讨论】:

    • 完美运行!非常简单有效。
    • 第一行什么都不做,因为它是重言式;确认:first_name 的存在,如果它不等于nil,但如果它不等于nil,那么它已经有一个值了!第二行不适用于belongs_to 关系。
    • 对关系也使用belongs_to :other_model, optional: true
    【解决方案2】:

    我想您应该删除个人资料页面中存在的所有字段的验证。 在将详细信息保存在 User 模型中的配置文件页面上之前,您可以从模型中调用方法。 该方法将检查这些字段所需的验证。

    【讨论】:

    • 好的,这可能是一个解决方案,但会很脏,因为 Rails 方式是将验证放在模型中。不过感谢您的回复。