Rails 3.1.0对嵌套属性的条件验证

时间:2012-08-07 02:42:16

标签: ruby-on-rails validation nested-attributes

我有一个Item可能属于Claim的结构,如果有的话,我还需要其他字段。这些是相关的代码片段:

class Claim
  has_many :items
  accepts_nested_attributes_for :items
  validates_associated :items
end

class Item
  belongs_to :claim
  validates :amount_paid, :presence => {:if => :claim}
end

这几乎适用于 。当我编辑现有 Claim并尝试在amount_paid字段中输入空格时,我会收到我想要的错误。 Claim在遇到此验证时应该存在,因为之前的迭代也是有效的,等同于

validates :claim_id, :presence => {:unless => :new_claim?}
...
def new_claim?
  claim.new_record? # would have thrown an error if claim was nil
end

但是当我在其Claim上创建一个空白amount_paid字段的 Items时,验证通过,而不应该通过。

无济于事,我也试过了

validates :amount_paid, :presence => {:if => :claim_exists?}
...
def claim_exists?
  !!claim
end

还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

我所做的可能是一些黑客攻击,但似乎有效:

class Item
  ...
  validates :amount_paid, :presence => {:if => :claimed?}
  ...
  def claimed?
    !!claim || caller.any? { |m| m =~ /claims_controller/ }
  end
end

因此,如果声明存在,或者在堆栈跟踪中的任何位置从ClaimsController调用此声明,则验证将会运行。

我仍然欢迎任何有更好主意的人的意见。

答案 1 :(得分:0)

我认为可以通过向关联添加:inverse_of选项来解决问题:

class Claim
  has_many :items, :inverse_of => :claim
end

class Item
  belongs_to :claim, :inverse_of => :items
end

(自从我遇到这个问题已经有一段时间了,所以如果你遇到和我一样的问题,那就做一些实验吧。)