ネストされた子と孫のレコードを作成しようとしています。子は親と孫の両方に属します。まだ保存されていないため、子は孫の存在を検証しません。
私は Rails 2.3.11、Formtastic、InheritedResources、および Haml を使用していますが、その他はすべて正しく動作しているようです。たとえば、孫の検証エラーが親フォームに適切に入力され、無効な値が記憶されてユーザーに表示されます。 . 親モデルは、すべてが有効でない限り、更新しようとさえしません。
私のコードは次のようなものですが、問題のドメインは異なります。
class Project < ActiveRecord::Base
has_many :meetings, :dependent => :destroy
accepts_nested_attributes_for :meetings
end
class Meeting < ActiveRecord::Base
belongs_to :project
belongs_to :task
accepts_nested_attributes_for :task
validates_presence_of :task_id, :project_id
end
class Task < ActiveRecord::Base
has_many :meetings, :dependent => :destroy
end
プロジェクトは常に存在し、見たくないミーティングが既に存在する可能性があります。タスクは、他のミーティングを通じて他のプロジェクトに属する場合がありますが、この場合、タスクとミーティングは常に新しいものです。
コントローラーでは、新しいアクションでのみ空のレコードを作成します
@project.meetings.build
次のようにデータを保存します。
@project.update_attributes(params[:project])
そしてビューで
- semantic_form_for @project do |f|
- f.semantic_fields_for :meetings do |m|
- next unless m.object.new_record?
= m.semantic_errors :task_id
- m.object.build_task unless i.object.task
- m.semantic_fields_for :task do |t|
- f.inputs do
= t.input :task_field
= m.input :meeting_field
フォームを保存しようとすると、「タスクを空白にすることはできません」という検証エラーが表示されます。確かに、Task はまだ保存されていません。検証しようとしていますが、ID がありません。
子レコードの前に孫レコード (タスク) が作成されるようにする簡単でエレガントな方法はありますか?
Meeting モデルで次のようなことを試しました。
before_validation_on_create do |meeting|
meeting.task.save if meeting.task.valid?
end
これでタスクが保存されたように見えますが、ミーティングはまだ正しい ID を取得していません。同じエラーですが、タスク レコードが作成されます。
私もこれを試しました:
before_validation_on_create do |meeting|
new_task = meeting.task.save if meeting.task.valid?
meeting.task = new_task
end
これは ActiveRecord::RecordNotFound "Couldn't find Task with ID=XX for Meeting with ID=" を発生させるという奇妙な動作をします - これは一種の取得ですが、赤ニシンのようです。
また、すべての関係に :inverse_of を追加して、:task_id の代わりに :task を検証してみました。後者は、奇妙なことに失敗しますが、エラー メッセージは表示されないようです。
ここでの私の実際の目標は、複数のタスクを作成し、それぞれが以前に選択したプロジェクトで最初の会議を行うことです...そのため、問題に対して別のアプローチを取ることができます-コントローラーで単純で醜いことを行うか、最初のタスクを作成することができますプロジェクトの after_create での会議。しかし、これはとてもきれいで、すぐに機能します。:task_field と :meeting_field で適切な検証エラーが発生しているという事実は、正しい軌道に乗っていることを意味します。
問題が何であるかはわかりますが、それを解決する方法はわかりません。明らかな何かが欠けているのではないかと思います。
ありがとうございました!