2

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

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

+1

你只需要使用'@goal.milestones .build'在新的行动中,如果你想要一个'空白'的里程碑形式。这个代码在控制器中更好。 –

+0

我确实有一个质量指派问题,我修正了。我还在表单中添加了@ goal.milestones.build和@ goal.tasks.build。之后,我将所有内容都保存起来,但在编辑表单时,没有任何目标数据显示出来(它看起来就像一个'新'表单)。我有一种感觉,我正在做错事,只是因为这变得有多困难。 –