我创建了一个复杂的嵌套表单,但是我的应用程序根据该表单的输入正确创建/编辑记录的部分存在问题。
待办事项场景:我需要从一堆写有任务的小论文中将任务一个接一个地输入到我的表单中(每个“提交”按一个任务)。每个任务都有一个 :project_number、一个 :project_number_type 和一个 :owner 写在上面。在我的应用程序中,这些属性位于模型 ProjectNumber(前两个)和 Owner(最后一个)中。(我必须制作一个单独的 ProjectNumber 模型,因为我的项目有时可以有多个不同 project_number_types 的:project_numbers。)
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
字段。(我省略了诸如 accept_nested_attributes_for 之类的内容)。
2个相关(我认为)问题:
我的表单从不创建任何新项目!我用来创建嵌套表单的 Cocoon gem 让我为每个嵌套模型创建表单部分。在 Project 部分中,由于我的 Project 模型本身没有 :number 属性,而是与 ProjectNumbers 模型相关联,因此我只引用了 ProjectNumbers 部分及其属性。
如果任务的 :project_number、:project_number_type 和 :owner 都与与现有项目关联的那些匹配,我需要将我的应用程序添加到
edit
具有新任务的现有项目中。否则,它应该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