私はRailsモデルでaccepts_nested_attributes_forを使用しています。親を作成した後に子を保存したいと思います。accepts_nested_attributes_for子の関連付けの検証に失敗する
フォームは完全に機能しますが、検証に失敗しています。簡単にするため、次のを想像してみてください。
class Project < ActiveRecord::Base
has_many :tasks
accepts_nested_attributes_for :tasks
end
class Task < ActiveRecord::Base
belongs_to :project
validates_presence_of :project_id
validates_associated :project
end
そして、私は実行しています:以来、彼らは(PROJECT_IDを持っていないので、
Project.create!(
:name => 'Something',
:task_attributes => [ { :name => '123' }, { :name => '456' } ]
)
をプロジェクトモデルを保存すると、検証がタスクに失敗していますプロジェクトは保存されていません)。
- 検証プロジェクト
- 検証作業
- プロジェクトの保存
- 保存作業
パターンは次のようになります:
Railsは以下のパターンに従っているように思え
-
パスで
- 検証プロジェクト
- :パス上のプロジェクトを保存して続行...
- 検証作業
- :失敗でタスク
- を保存:プロジェクト(?たぶんロールバック)
を削除します。
私の質問には、次のようなものがあります。どのようにして、Railsにproject_id =(またはproject =)メソッドと子プロセスの検証を実行させることができますか? (プロジェクト)が保存されましたが、子(タスク)が無効な場合、親(プロジェクト)モデルを保存しないでください。
アイデア?
これは私のために動作しませんでした。 validates_presence_of:project_idの呼び出しで、 'project'はnilを返してproject_idを検証し、検証を失敗させます。私は問題が異なると思ったので別の質問を作成しましたが、それは同じであるようですhttp://stackoverflow.com/questions/2102724/rails-nested-attributes-association-validation-failing。 –
以下の解決策のinverse_ofは、Rails 3.0以上でより正確です。 – nertzy