2

Itema が a に属している可能性がある構造を持っています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

しかし、その上に空白のフィールドを持つ新しい を作成すると、検証はパスしますが、パスする必要はありません。Claimamount_paidItems

無駄に、私も試しました

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

他のアイデアはありますか?

4

2 に答える 2

0

私がやったことはおそらく少しハックですが、うまくいくようです:

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

したがって、クレームが存在する場合、またはこれがClaimsControllerスタック トレースの任意の時点から呼び出されている場合、検証が実行されます。

より良いアイデアをお持ちの方からのご意見をお待ちしております。

于 2012-08-07T04:06:59.117 に答える
0

:inverse_of関連付けにオプションを追加することで問題を解決できると思います。

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

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

(ただし、これに遭遇してからしばらく経ちました。そのため、私と同じ問題を抱えている場合は、少し実験してください。)

于 2012-10-15T21:42:14.903 に答える