2

複雑なネストされたフォームを作成しましたが、アプリがそのフォームからの入力に基づいてレコードを正しく作成/編集する部分で問題が発生しています。

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つの関連する(私が思う)問題:

  1. 私のフォームは新しいプロジェクトを作成することはありません!ネストされたフォームの作成に使用しているCocoongemを使用すると、ネストされたモデルごとにフォームパーシャルを作成できます。Projectパーシャルでは、Projectモデル自体に:number属性がなく、代わりにProjectNumbersモデルに関連付けられているため、ProjectNumbersパーシャルとその属性への参照があります。

  2. editタスクの:project_number、:project_number_type、および:ownerがすべて既存のプロジェクトに関連付けられているものと一致する場合は、新しいタスクを使用して既存のプロジェクトにアプリを追加する必要があります。それ以外の場合は、createそのタスクが属する新しいプロジェクトである必要があります。

私はここや他の場所でたくさんの小さなコードを読んでいますが、もう少し何かが必要です。おそらく、のような「何」と.first_or_initialize、のような「どこ」も含まれています/models/task.rbtasks_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
4

0 に答える 0