【问题标题】:Rails Nested Attributes Association Validation FailingRails嵌套属性关联验证失败
【发布时间】:2011-01-07 08:18:20
【问题描述】:

我有 Rails 模型的嵌套属性,并且由于某种原因关联验证失败。我没有使用accepts_nested_attributes_for,但我正在做一些非常相似的事情。

class Project < ActiveRecord::Base
  has_many :project_attributes

  def name
    project_attributes.find_by_name("name")
  end

  def name=(val)
    attribute = project_attributes.find_by_name("name")

    if attribute
      attribute.value = val
    else
      project_attributes.build(:name=>"name", :value=>val)
    end
  end
end

class ProjectAttribute < ActiveRecord::Base
  belongs_to :project

  validates_presence_of :name
  validates_uniqueness_of :name, :scope => :project_id

  validates_presence_of :project_id, :unless => lambda {|attribute| attribute.project.try(:valid?)}
  validates_associated :project

end

这是一个人为的例子,但与我正在尝试做的类似。我查看了 accept_nested_attributes_for 的作用,它使用了 build 方法,我认为该方法会将 build 属性与项目相关联。

我还查看了accepts_nested_attributes_for child association validation failing,它给了我validates_presence_of :unless=&gt;valid?

关于如何让它发挥作用的任何想法?

【问题讨论】:

  • 我尝试将其更改为使用 Accepts_nested_attributes_for 并且遇到了同样的问题。在 validates_presence_of :project_id 调用“项目”返回 nil。

标签: ruby-on-rails validation activerecord nested associations


【解决方案1】:

validates_related 看起来比它的价值更麻烦。如果您删除 validates_presence_of :project_id,则您的示例有效。这是一个恢复验证的 hacky 示例(找到描述 here)。

class ProjectAttribute < ActiveRecord::Base
  belongs_to :project

  validates_presence_of :name
  validates_uniqueness_of :name, :scope => :project_id

  validates_presence_of :project_id, :unless => Proc.new { |project_attribute|
    project = project_attribute.project
    ObjectSpace.each_object(Project) {|o| project = o if o.project_attributes.include?(project_attribute)} unless project
    project
  }
end

【讨论】:

    【解决方案2】:

    只需在 project_id 上添加非空约束,如果发生奇怪的事情,让它爆炸。哦,确保你的测试覆盖率也很好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多