嵌套属性不保存在具有多态关联的表单中

时间:2011-07-12 02:44:32

标签: ruby-on-rails ruby-on-rails-3 nested-forms polymorphic-associations form-for

我正在尝试创建一个应用程序,用户可以在其中保存目标,这些目标的里程碑,里程碑的任务以及目标本身的任务。我正在使用多态关联,但是使用表单来输入所有这些关联已经证明是困难的。问题是里程碑根本没有保存,里程碑任务在数据库中被列为具有“目标”类型而不是“里程碑”类型模型和数据库的设置类似于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 %>

1 个答案:

答案 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