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。之後,我將所有內容都保存起來,但在編輯表單時,沒有任何目標數據顯示出來(它看起來就像一個'新'表單)。我有一種感覺,我正在做錯事,只是因爲這變得有多困難。 –