【发布时间】:2015-05-09 20:24:48
【问题描述】:
3/13 更新:
我用我的模型、控制器逻辑和几个表单版本制作了一个小型示例项目。
我正在构建一个表单,用户可以在其中一起添加“任务”和“里程碑”。 (即任务='真空'在里程碑='干净的房子'内)。它基本上是一个任务/子任务类型模型,父是“里程碑”,子是“任务”。
任务和里程碑都属于“项目”......所以我试图通过具有更新操作的嵌套表单添加任务和里程碑。我认为要走的路是为每个 @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 在 cmets 中的请求,我从 Chrome 检查器中添加了我的 POST 代码。如您所见,表单甚至没有调用任务,只是调用父里程碑。里程碑显示在表单中,但任务没有....
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][]:
【问题讨论】:
-
发往服务器的 post 请求的结构是什么样的?查看检查器中(在 chrome 中)form-data 下的网络事件。
-
我已经更新了我的帖子请求。谢谢。
标签: ruby-on-rails forms checkbox nested-attributes strong-parameters