2011-12-07 47 views
1

我有一個嚮導負責創建3種不同類型的資源。當用戶完成嚮導時,用戶點擊提交併發送ajax POST以創建3個新條目。這3個資源全部屬於用戶。我想知道是否應該向用戶控制器發送1個ajax請求,其中包含所有3個資源的詳細信息,或者如果我應該POST 3個單獨的ajax請求到每個資源的控制器。什麼是正確的方法來做到這一點?謝謝!在Rails中創建嵌套資源的最佳實踐

回答

3

首先,一個小小的更正:你不能發佈請求到資源模型。我相信你在談論的是張貼到模型的各個控制器(我認爲存在)。

如果您有嚮導的單一表單,那麼就您所瞭解的那樣,它將只發布一次。爲什麼不用這個工作?但在我們走之前,讓我們來談談替代方案。

你提出的建議是,啓動3個Ajax請求會帶來比解決問題更多的問題。例如,如果其中一個請求發生錯誤,該怎麼辦?如果你想遵循原子性原則,你如何取消另外兩個。可能還有其他的原因,爲什麼這樣的設計考慮將是一個壞的,但我認爲這是足夠的麻煩。讓我們繼續討論如何處理這個問題。

負責嚮導窗體的控制器應該提供更多的邏輯來處理3個額外的資源。如果資源類型相似,則可以使用單表繼承或其他方法來簡化某些控制器代碼,但這並不相關。我們將假設這些資源根本不相似。

簡而言之,您可以將表單構建爲多模型表單。如果用戶可以爲每種類型的資源創建多個條目,那麼您將擁有一個創建多個子模型的表單。

如果您只需要每種資源中的一種,那麼答案就非常簡單,只需在您的用戶模型中使用accepts_nested_attributes_for方法,然後在您的視圖中使用fields_for方法即可。

如果您需要每個資源的多個,那麼也許您可能希望瞭解更多關於multiple children models in a form的信息。

+0

感謝Jaryl的詳細回覆,看起來像多模式形式是要走的路。作爲後續,如果我的一個資源不使用傳統的html 方法並使用visual javascript/html canvas輸入法,我應該使用javascript自動填寫隱藏表單?這就是爲什麼我要求自己做ajax post請求的原因,因爲我的輸入數據是以javascript的形式出現的。 – stackOverlord

+1

我之前沒有使用過畫布數據,但我認爲使用隱藏表單域會更好/更容易。只有當你真的需要它時纔會練習ajax,就像需要異步處理一樣。 – Jaryl