【问题标题】:Rails - Contextual validations based on stateRails - 基于状态的上下文验证
【发布时间】:2014-07-01 02:24:26
【问题描述】:

假设有一个这样的帖子模型:

class Post < ActiveRecord::Base
  .......
  .......
end

它有两个属性:title:body

现在一个 Post 对象可以经历多个阶段:'draft' -> 'published'

现在在草稿模式下保存帖子时,不需要 :title。但是在以发布模式保存时,它需要对标题进行存在验证:

validates_presence_of :title

现在,在 Rails 中最好的方法是什么?我认为装饰器模式的一些实现会很棒,其中在控制器中,我会动态地将验证添加到活动记录对象。

这是我遇到的一个更大问题的简化版本。在实际案例中,还有更多的验证,包括对关联对象进行的验证。

【问题讨论】:

    标签: validation


    【解决方案1】:

    如果您使用state_machine 进行状态转换,它支持您正在寻找的内容,并在自述文件中提供示例。

    否则,所有 Rails 验证都有可选的 if 参数。例如,如果您的帖子有一个 published? 方法来返回它是否处于已发布状态,您可以编写 validates_presence_of :title, if: :published? 并让它完全满足您的需求。

    【讨论】:

    • 非常感谢!我使用aasm 表示状态。可能是时候切换到 state_machine 了 :)
    • 暂时不要急于切换 - state_machine 更受欢迎,但似乎不再积极开发。
    • 哦,对了。另一件事,就我而言,我还必须在状态更改期间验证关联模型,我该怎么做?
    猜你喜欢
    • 2019-12-05
    • 2018-08-14
    • 1970-01-01
    • 2020-09-16
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    相关资源
    最近更新 更多