Добавить несколько вложенных атрибутов через флажки Rails 4 (возможно, с несколькими формами)

3/13 ОБНОВЛЕНИЕ:
Я сделал небольшой пример проекта с моими моделями, логикой контроллера и несколькими версиями форм.



Я создаю форму, где пользователь может добавить «Задачи» и «Вехи» вместе. (т.е. Task = 'Vacuum' находится внутри Milestone = 'clean House'). Это в основном модель типа «Задача / Подзадача», в которой родительский элемент - «Веха», а дочерний - «Задача».

И Задачи, и Вехи принадлежат «Проекту» .... поэтому я пытаюсь добавить Задачи и Вехи через вложенную форму с действием обновления. Я думаю, что для этого нужно создать форму для каждого экземпляра @task_template и обновить сразу несколько форм.

Моя проблема в том, что я также пытаюсь динамически устанавливать «начальные этапы / задачи» с помощью таблиц, называемых «MilestoneTemplates» и «TaskTemplates» ....

Пользователь открывает страницу «Добавить этапы / задачи» и, в зависимости от своего типа проекта, видит рядом с флажками массив готовых задач (@task_templates) и этапов (@milestone_templates). Затем пользователь проверяет флажок рядом с задачей или этапом, который он хотел бы добавить. Это должно создать конкретную задачу для пользователя с предварительно встроенным @ task_template.name, @ task_template.description ... и т. Д.

Я не могу заставить это даже создать 1. Я использую Rails 4, и я думаю, что я правильно установил свои strong_params. Ниже я нахожусь на этом:

Модели:

class Task < ActiveRecord::Base
    belongs_to :user
    belongs_to :project
  belongs_to :milestone

class Milestone < ActiveRecord::Base
 belongs_to :project
 belongs_to :user
 has_many :tasks, dependent: :destroy, inverse_of: :milestone
 accepts_nested_attributes_for :tasks, allow_destroy: true

class Project < ActiveRecord::Base
 has_many :milestones, dependent: :destroy
 has_many :tasks, dependent: :destroy
 accepts_nested_attributes_for :tasks, allow_destroy: true
 accepts_nested_attributes_for :milestones, allow_destroy: true

 #the "Starter Milestones & Tasks"

class MilestoneTemplate < ActiveRecord::Base
    has_many :task_templates, dependent: :destroy, inverse_of: :milestone_template

class TaskTemplate < ActiveRecord::Base
     belongs_to :milestone_template,  inverse_of: :task_templates

контроллер:

class ProjectsController < ApplicationController

def new_milestones
 @project = Project.find(params[:p])
 @project.milestones.build
 @project.tasks.build
 @milestones_templates = MilestoneTemplate.where(template_id: @project.template_id)
end

def create_milestones
 @project.milestone_ids = params[:project][:milestones]
 @project.task_ids = params[:project][:tasks]
 @milestone = Milestone.new
 @task = Task.new
 @template = Template.find( @project.template_id)
  if @project.update_attributes(project_params)
    redirect_to  view_milestones_path(p: @project.id)
    flash[:notice] = "Successfully Added Tasks & Milestones"
  else
    redirect_to  new_milestones_path(p:  @project.id )
    format.json { render json: @project.errors, status: :unprocessable_entity }
  end
end

def project_params
      params.require(:project).permit( :id, :name,
        milestones_attributes: [:id, {:milestone_ids => []}, {:ids => []}, {:names => []}, :project_id, :user_id,
            :name, :description, :due_date, :rank, :completed, :_destroy,
        tasks_attributes: [:id, {:task_ids => []}, {:names => []},  {:ids => []}, :milestone_id, :project_id,    
          :user_id, :name, :description, :due_date, :rank, :completed,  :_destroy]] )
end
end

Форма теста 1:

<%= form_for @project, url: create_milestones_path(p: @project.id) do |f| %>
     <label>Milestones</label><br>
     <div class="row">
       <%= hidden_field_tag "project[names][]", nil %>
       <% @milestones_templates.each do |m| %>
         <%= check_box_tag  "project[names][]", m.name, @milestones_templates.include?(m), id: dom_id(m)%> 
         <%= label_tag dom_id(m), m.name  %>

           <%= hidden_field_tag "project[milestone][names][]", nil %>
           <% m.task_templates.each do |t| %>
             <%= check_box_tag  "project[milestone][names][]", t.name, m.task_templates.include?(t), id: dom_id(t) %> 
             <%= label_tag dom_id(t), t.name  %>
           <% end %>
       <% end %>
     </div>
 <%= f.submit %>

Тест формы 2 (попытка отправить массив форм):

 <label>Milestones</label><br>
   <%= hidden_field_tag "project[milestone_ids][]", nil %>
   <% @milestones_templates.each do |m| %>
   <div>
      <%= f.fields_for :milestones do |fm|%>
         <%= check_box_tag    "project[milestone_ids][]",  @milestones_templates.include?(m), id: dom_id(m) %> 
         <%= label_tag dom_id(m), m.name  %></div>
      <%= hidden_field_tag :name, m.name %>
      <%= hidden_field_tag "project[milestone][task_ids][]", nil %>

         <% m.task_templates.each do |t| %>
         <%= fm.fields_for :tasks do |ft| %>
               <%= check_box_tag  "project[milestone][task_ids][]", t.name,  m.task_templates.include?(t), id: dom_id(t)%> 
               <%= label_tag dom_id(t), t.name  %>
         <% end %>
         <% end %>
      <% end %>
   <% end %>
   </div>

согласно запросу xcskier56 в комментариях, я добавил свой POST-код от инспектора Chrome. Как вы можете видеть, форма даже не вызывает Задачи, а только родительские Вехи. Вехи отображаются в форме, но задачи не ....

project[formprogress]:2
project[milestone_ids][]:
project[milestone][names]:true
name:Milestone 1
project[milestone][task_ids][]:
project[milestone][names]:true
name:Milestone 2
project[milestone][task_ids][]:
project[milestone][names]:true
name:Milestone 3
project[milestone][task_ids][]:
project[milestone][names]:true
name:Milestone 4
project[milestone][task_ids][]:

Ответы на вопрос(1)

Ваш ответ на вопрос