2011-04-03 38 views

回答

1

按照正常方式設置控制器。您需要使用Rails的嵌套屬性功能。這使您可以在使用一個表單創建其父項的同時創建子對象。

This is my go-to link for nested attributes。如果您運行的是Ruby 1.9.2,則需要進行的唯一更改位於setup_person幫助程序中。 returning已被棄用,所以你可以把它改成:

def setup_person(person) 
    person.tap do |p| 
    p.children.build if p.children.empty? 
    end 
end 

在典型的Rails風格,這將僅僅使用標準的控制器爲每個資源的工作

其他鏈接

http://weblog.rubyonrails.org/2009/1/26/nested-model-forms

http://jeffperrin.com/2009/06/04/rails-nested-forms-and-collection_select/

+0

這比嵌套資源要好嗎? – 2011-04-03 06:51:44

+0

真的是一回事。在上面的例子中,你將有一個普通的'form_for'人,並且在這個表單中,你將能夠創建x個孩子。假設你在你的模型中有正常的關聯*和*聲明'accep_nested_attributes_for',這將創建你想要的結構。 – 2011-04-03 06:53:28

+0

您的'setup_person'方法中定義的'person'變量在哪裏? – 2011-04-03 06:54:46

0

我沒有那個文檔我通常做一個網頁來源,但我創建了一個gist,其中記錄我做什麼最經常在這裏:https://gist.github.com/900241


該要點的前提是,你有一個具有許多項目角色的項目模型,並且您想要編輯項目表單中的許多項目角色。這幾乎是經典的accepts_nested_attributes_for情況,幾乎任何討論它的頁面都會給你一個體面的寫作。問題是,我見過的解決方案總是涉及到一些嚴重雜亂的強大的JavaScript,它們逃脫了整個表單視圖,並將它扔到鏈接的onClick方法中。我最近想出了一個使用jQuery模板的更簡潔清晰的方法。

當您移動到嵌套模型時,您無需對您的ProjectsController執行任何操作。一切正常在控制器級別工作,並且您甚至不需要ProjectRolesController。 (這就是爲什麼我不打擾他們的要點。)在模型層面,這只是標準的accepts_nested_attributes_for。它在哪裏變得有趣。

該項目形式有兩個form_for塊:一個呈現jQuery模板,另一個呈現項目角色形式。 jQuery模板反過來只是呈現項目角色形式(mmm DRY!),但是來自<script>標記,並且具有空白項目角色。由於表單在腳本標記內,因此不會與項目表單一起提交,並且因爲腳本類型爲「text/x-jquery-tmpl」,所以這是完全有效的標記。

當用戶點擊「添加項目角色」時,它會觸發一些jQuery,它會在模板中使用表單,用當前日期替換索引(這是唯一可以識別的項目角色),以及將其附加到表單的項目角色部分的末尾。

當用戶點擊項目角色旁邊的「刪除」時,它會檢查項目角色是否爲新記錄,如果不是,則會在表單末尾附加一個「_delete」隱藏字段。無論哪種情況,它都會從DOM中刪除項目角色div。

+0

我知道羅賓已經把你和大多數受歡迎的文章關聯起來......我仍然會推薦我的方法,它建立在這些其他方法中。這些舊文章中提到的JavaScript是我討論的非常混亂的JavaScript。 – carpeliam 2011-04-03 07:14:45

相關問題