複雑なネストされたフォームを作成しましたが、アプリがそのフォームからの入力に基づいてレコードを正しく作成/編集する部分で問題が発生しています。
To-Doシナリオ:タスクが書かれた小さな紙の山から、フォームにタスクを1つずつ入力する必要があります(「送信」プレスごとに1つのタスク)。各タスクには、:project_number、:project_number_type、および:ownerが記述されています。私のアプリでは、これらの属性はモデルProjectNumber(最初の2つ)とOwner(最後のモデル)にあります。(プロジェクトには異なるproject_number_typesの複数の:project_numbersが含まれる場合があるため、別のProjectNumberモデルを作成する必要がありました。)
class Owner < ActiveRecord::Base
has_many :projects
has_many :tasks, :through => :projects
end
class Project < ActiveRecord::Base
belongs_to :owner
has_many :tasks
has_many :project_numbers
end
class ProjectNumber < ActiveRecord::Base
belongs_to :project
end
class Task < ActiveRecord::Base
belongs_to :project
delegate :owner, :to => :project, :allow_nil => true
end
fields_for
私のフォームには、上記の各属性の正しいネストされたフィールドが表示されます。(accepts_nested_attributes_forなどは省略しました)。
2つの関連する(私が思う)問題:
私のフォームは新しいプロジェクトを作成することはありません!ネストされたフォームの作成に使用しているCocoongemを使用すると、ネストされたモデルごとにフォームパーシャルを作成できます。Projectパーシャルでは、Projectモデル自体に:number属性がなく、代わりにProjectNumbersモデルに関連付けられているため、ProjectNumbersパーシャルとその属性への参照があります。
edit
タスクの:project_number、:project_number_type、および:ownerがすべて既存のプロジェクトに関連付けられているものと一致する場合は、新しいタスクを使用して既存のプロジェクトにアプリを追加する必要があります。それ以外の場合は、create
そのタスクが属する新しいプロジェクトである必要があります。
私はここや他の場所でたくさんの小さなコードを読んでいますが、もう少し何かが必要です。おそらく、のような「何」と.first_or_initialize
、のような「どこ」も含まれています/models/task.rb
かtasks_controller.rb
?たぶん私は何かカスタムを作成する必要がありますか?本当にありがとう!
編集:これがフォームの部分です
====/views/tasks/_form.html.slim
= simple_form_for @task do |f|
#project
= f.simple_fields_for :project do |project|
= render 'project_fields', :f => project
====/views/tasks/_project_fields.html.slim
.nested-fields
.project_numbers
= f.simple_fields_for :project_numbers do |project_number|
= render 'project_number_fields', :f => project_number