我正在尝试创建一个应用程序,用户可以在其中保存目标,这些目标的里程碑,里程碑的任务以及目标本身的任务。我正在使用多态关联,但是使用表单来输入所有这些关联已经证明是困难的。问题是里程碑根本没有保存,里程碑任务在数据库中被列为具有“目标”类型而不是“里程碑”类型模型和数据库的设置类似于the top answer for this question。 我希望有人可以看看我的form_for实现,看看它是否正确,或者问题是否在其他地方。如果您需要查看其他代码,请告诉我。
<%= nested_form_for @goal do |f| %>
<%= render 'shared/error_messages', :object => f.object %>
<%= render 'shared/goal_fields', :f => f %>
<%= f.fields_for :milestones do |ff| %>
<%= render 'shared/milestone_fields', :f => ff %>
<% end %>
<%= f.fields_for :tasks do |ff| %>
<%= render 'shared/task_fields', :f => ff %>
<% end %>
<%= f.link_to_add "Add Milestone", :milestones %>
<%= f.link_to_add "Add Task", :tasks %>
<%= f.submit %>
<% end %>
答案 0 :(得分:1)
Rails表单构建器方法fields_for允许您嵌套多个记录的属性。这部分代码看起来是正确的(假设你的部分工作正常)。您可以通过构建目标对象之间的关系来使您的fields_for行更加明确,如下所示:
<%= f.fields_for :milestones, @goal.milestones.build do |ff| %>
<%= render 'shared/milestone_fields', :f => ff %>
<% end %>
确保您的模型具有以下代码,以便处理将传递给每个模型的参数:
# app/models/goal.rb
has_many :milestones
has_many :tasks
accepts_nested_attributes_for :milestones
accepts_nested_attributes_for :tasks
# app/models/milestone.rb
has_many :tasks
accepts_nested_attributes_for :tasks # For tasks on milestones
同时确保如果您使用attr_accessible来锁定模型属性以进行质量分配,则这些条目具有相应的条目(milestones_attributes,tasks_attributes等)
提交表单时,请查看rails开发日志,并确保以类似于以下格式的方式查看参数:
{:goal =&gt; {:milestones_attributes =&gt; {:tasks_attributes =&gt; {},:tasks_attributes =&gt; {}}}
如果所有这些数据都已通过,但记录仍未保存,请检查日志中的“ROLLBACK”条目,这些条目可能表示记录无效且无法插入。
有关nested_attributes的更多信息,请访问: http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html
可以在此处找到使用这些嵌套属性的表单助手的信息: http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for