2

我正在尝试制作一个应用程序,用户可以在其中保存目标、这些目标的里程碑、里程碑的任务以及目标本身的任务。我正在使用多态关联,但事实证明很难制作一个表格来输入所有这些关联。问题是里程碑根本没有保存,里程碑任务在数据库中列为“目标”类型而不是“里程碑”类型。模型和数据库的设置就像这个问题的最佳答案一样。我希望有人可以看看我的 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 %>
4

1 回答 1

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 => {:milestones_attributes => {:tasks_attributes => {}, :tasks_attributes => {} }}

如果所有这些数据都在通过,但记录仍未保存,请检查日志中可能指示记录无效且无法插入的“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

于 2011-07-12T03:32:45.927 回答