ruby-on-rails - 通过父属性进行 ActiveRecord 验证

标签 ruby-on-rails validation activerecord parent

例如,我有模型文章。文章有_一篇文章内容。默认情况下,ArticleContent 对其所有属性进行验证。但我需要额外的功能 - 保存草稿文章,而不进行任何验证。 因此,我将 :draft => false 作为 Article.new() 中的参数之一传递,接下来我执行 @article.build_article_content()。 ArticleContent 中有一些不起作用的代码:

  def draft?
    raise self.article.draft
  end

  validates_presence_of :header, :message => "We have no fuckin' header!", :unless => :draft?

这当然不行。在草稿的那一刻?执行时,任何地方都没有任何合适的 Article 对象,因此 self.article 返回 nil。不错的尝试,codemonkey...

有人有一些好主意吗?我想制作@content.save!这不是一个好主意

更新

我尝试过:

def draft
    self[:draft]
end

def draft=(value)
    self[:draft] = value
end

def draft?
    self[:draft]
end

validates_presence_of :field1, :message => "msg1", :unless => :draft?
validates_presence_of :field2, :message => "msg2", :unless => :draft?
validates_presence_of :field3, :message => "msg3", :unless => :draft?

它可以工作,但是我如何对其进行分组?

unless self.draft?
    validates_presence_of :field1, :message => "msg1"
    validates_presence_of :field2, :message => "msg2"
    validates_presence_of :field3, :message => "msg3"
end

说的是草稿?没有找到方法。我也应该这样做

@article.content.draft = @article.draft

而且它看起来也像是肮脏的黑客

最佳答案

这是状态机的常见用例。有几个 Rails 插件可以提供这些功能。

http://ruby-toolbox.com/categories/state_machines.html

如果您不需要完整的状态机实现,那么在您的 ArticleContent 模型中拥有一个状态列仍然会很有帮助。它的值可以是“新的”、“草稿”、“已发布”等。您的验证在决定要做什么时会查看该列的值,例如:

validates :content, :presence => true, :unless => Proc.new { |a| a.state == "Draft" }

(我很确定这不是正确的语法,但您应该明白我的目标。)

回答您的更新

尝试使用_options。

with_options :unless => :draft? do |o|
    o.validates_presence_of :field1, :message => "msg1"
    o.validates_presence_of :field2, :message => "msg2"
    o.validates_presence_of :field3, :message => "msg3"
end

看看你的代码,有一些味道。为了使验证失败,需要做的是 errors.add(blah),而不是引发异常。此外,为访问草稿列定义的方法看起来有点多余。他们只是做 AR 会做的事情。

关于ruby-on-rails - 通过父属性进行 ActiveRecord 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4678654/

相关文章:

ruby-on-rails - Ruby on Rails - 压缩和下载 pdf 文件

jquery - 使用 jquery validate 验证月份/年份

ruby-on-rails - 我怎样才能让自动测试在失败后继续运行我的规范而不停止?

ruby-on-rails - Rails 一直在源代码中启动终端类型?

javascript - Angular 表单验证 - 将毫秒转换为有效日期对象

php - 基于多个动态值的Where子句,CodeIgniter

ruby-on-rails - 有什么方法可以使用 AREL 进行自定义关联吗?

php - 使用 CodeIgniter Active Records 对多个数据库进行 MySQL 优化

ruby-on-rails - Rails - 构建一个使用 <WBR> 打破长单词/URL 的助手

wpf - 如果没有发生验证错误,如何在工具提示中显示文本框的文本。否则显示验证错误