2.1.xからRails 2.3.3にアップグレードしましたが、私はメソッドを見つけようとしています。このメソッドを使用して既存のネストされたオブジェクトを更新することはできますが、新しいネストされたオブジェクトを作成するためには使用できません。私は次のように、ネストされたNote
で、新しいProduct
を作成しようとaccepts_nested_attributes_forを使用して入れ子になったオブジェクトを作成する方法
class Product < ActiveRecord::Base
has_many :notes
accepts_nested_attributes_for :notes
end
class Note < ActiveRecord::Base
belongs_to :product
validates_presence_of :product_id, :body
end
:不自然な例を考えると
ActiveRecord::RecordInvalid: Validation failed: Notes product can't be blank
:
params = {:name => 'Test', :notes_attributes => {'0' => {'body' => 'Body'}}}
p = Product.new(params)
p.save!
それはメッセージと妥当性が確認されません私はこれがなぜ起こっているのか理解しています - それはNote
クラスのvalidates_presence_of :product_id
のためであり、新しいレコードを保存するときにProduct
オブジェクトにはid
がありません。しかし、私はこの検証を削除したくありません。私はそれを削除するのは間違いだと思います。
Product
を手動で作成してからNote
を追加することで問題を解決することもできますが、これはaccepts_nested_attributes_for
の単純さに反するものです。
新しいレコードにネストされたオブジェクトを作成する標準的な方法はありますか?
この問題を添加することによって解決される:HAS_MANYするオプション、にhas_oneとbelongs_toのinverse_of。例えば、 http://www.daokaous.com/rails3.0.0_doc/classes/ActiveRecord/Associations/ClassMethods.html#M001988「双方向の関連付け」セクションの下に –
次の場合に検証を無効にすることを選択しました:id == nil 。それは新しいネストされたレコードを書くときにだけ起こるべきなので、私はそれが安全であることを望んでいます。奇妙なことに、この問題は2.3.8に至っています。 – aceofspades
inverse_ofは、レコードの親がまだ存在しない場合には動作していないようで、idをテストすることはできません。このネストされたハックが唯一の方法であるように見えます。 : – DGM