2012-06-15 94 views
0

我有兩個模型類,說父母和孩子。首先創建父母,然後可以添加孩子。嵌套屬性,父母與可選子

我想有一個編輯頁面,您可以編輯父的信息,並可能增加一個孩子。

我把它設置,以便家長可以訪問子屬性:

has_one :child 
accepts_nested_attributes_for :child 

在我看來,編輯父的信息,我有一個表格,顯示所有的家長信息,然後領域要麼編輯現有的子信息或添加新的子:

<%= form_for(@parent, :as => :parent, ... %>  
    <%= form.text_field(:field_one) %> 
    <%= form.text_field(:field_two) %> 

    <%= form.fields_for @child do |child| %> 
     <%= child.text_field(:child_field_one) %> 
     <%= child.text_field(:child_field_two) %> 
    <%end%> 
<%end%> 

的問題是,我能得到這個工作的唯一方法是讓我的父母編輯器創建一個新的子並將其與父渲染視圖前關聯。然後當用戶試圖保存時,我的控制器會檢查子字段是否爲空,如果是,則刪除新創建的子項。這一個問題是,它創建了一個空兒(假設一個孩子不存在)每個編輯頁面加載時間,然後將其保存到數據庫中(我不希望)

是否有在父級編輯頁面上顯示不存在的子項的字段而不在創建之前創建新子級的優雅方式?理想情況下,我希望一切都在一個表單上。我敢肯定,我可以想出一種以多種保存按鈕以多種形式進行此操作的方法。

回答

2

也許我不完全理解你想要做什麼,但如果您使用的是fields_for標籤,你需要一個對象。唯一的其他方式做到這一點是使用符號,並調用它爲:

<%=form.fields_for :child do |child| %> 

但是(假設甚至仍然有效Rails中3),這實際上等同於

<%=form.fields_for Child.new do |child| %> 

這是相同的as

@child = Child.new 

在控制器操作中。

我敢肯定的是,爲了使用表單助手,你需要一個對象來遍歷。

0

如果你不想除非用戶編輯它的子對象保存到數據庫中,一個辦法是有一個孩子對象模型驗證,以防止它被保存。