Rails - 基于状态的上下文验证

时间:2014-07-01 02:24:26

标签: validation

让我们说有一个像这样的帖子模型:

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

它有两个属性:title :body

现在,Post对象可以经历多个阶段:&#39; draft&#39; - &gt;的&#39;发表&#39;

现在,在草稿模式中保存帖子时,:title 并非必需。但是在以发布模式保存它时,它需要在标题上进行状态验证:

validates_presence_of :title

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

这是我遇到的更大问题的简化版本。在实际情况中,还有更多验证,包括在关联对象上完成的验证。

1 个答案:

答案 0 :(得分:0)

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

否则,所有rails验证都有可选的if参数。例如,如果您的帖子使用published?方法返回是否处于已发布状态,则可以编写validates_presence_of :title, if: :published?并让它完全按照您的需要进行操作。