我已經找到了一種方法,並再次閱讀我的原始文章,整件事情非常混亂,因爲我不知道如何正確地說出我想要完成的事情。我必須說很多我困惑的原因是因爲我想要的表單與任何模型都不對應,只是一個關聯計數,如果你想創建一堆沒有屬性的新對象,它最終是一個基本的html表單然而。我會先澄清然後展示我的解決方案。
澄清:
我有2個表:
- 認購
- Default_Subscription(預填充)
Subscription belongs_to Default_Subscriptions
Default_Subscription has_many Subscriptions
A用戶是蘇訂閱我的網站。這個過程是一步一步的:並非所有事情都發生在同一頁面上。
這一切都發生在subscribe_controller中。每個操作對應於該過程中的一個步驟。
其中一個操作是default_subscriptions。此操作列出了用戶可以選擇的Default_Subscriptions,除了他們不只是選擇,他們可以爲他們想要的每種類型的Default_Subscription輸入金額。
當Default_Subscriptions在default_subscriptions頁面上列出時,我想要一個帶有這些Default_Subscription每一個的html數字輸入的表單。當通過下一個按鈕提交表單時,我不知道如何從每個html輸入中收集數量,並創建一個Subscription.new數組,每個Subscription的default_subscription_id對應於正確的Default_Subscription。
一個可能的解決方案:
def default_subscriptions
@def_subscriptions = Default_Subscription.all
end
可以說,我要繼續後,所有的量是default_subscriptions頁面上輸入的頁面review_subscriptions。
這裏就是我所做創造適當的形式繼續在控制器中的下一個動作:
<%= form_tag({:controller => 'subscribe', :action => 'review_subscriptions'}, :method => 'post') do %>
<ol>
<% @def_subscriptions.each do |ds| %>
<li>
<%= ds.name + ' ' %>
<%= number_field_tag("subscription_counts[#{ds.id}]") %>
</li>
<% end %>
</ol>
<%= submit_tag('Next') %>
<% end %>
這裏的竅門是字符串傳遞給number_field_tag。通過在字符串的末尾放置一組方括號來表示一個field_tag方法參數,括號前的部分是散列的名稱,括號內的內容是散列中的鍵,提交按鈕會導致每個鍵的對應值爲該字段的值。很酷!
傳遞給下一個操作的參數將包含一個名爲subscription_counts的散列,並且通過該散列進行迭代將爲每個default_subscription_id提供相應的新訂閱量。像這樣:
def review_subscriptions
subscription_counts = params[:subscription_counts]
subscription_counts.each do |id, amount|
counter = Integer(amount)
until counter == 0
new_subscription = Subscription.new
new_subscription.default_subscription_id = Integer(id)
@subscriptions << new_subscription # @subscriptions is an instance variable
counter -= 1
end
end
end
我只是想指出,我與他們合作的越多,我越愛他們;我喜歡Rails,我喜歡Ruby。他們是超級有趣和優雅。直到循環...這有多酷?如果您有其他解決方案,現在我的問題更加明顯,請加入!我知道其他人正試圖找到一些巧妙的方法來創建多個新的對象在一對多的關聯中,像這樣的單個後期調用。從技術上講,我的對象並沒有保存在數據庫中,但現在不會太難。
主要參考其幫助過我的最深遠這個解決方案是: http://guides.rubyonrails.org/form_helpers.html
如果你是新的軌道,並困惑的形式,請閱讀本。我現在感覺自己像個主人。 Rails開發人員非常善於記錄事物!
感謝您的詳細和有益的答案,因爲它澄清了一些其他的事情。這個表單框不是任何模型的字段,它是關聯的計數。讓我改述一下:表單框中的每個數量表示要創建的新訂閱數量。每個訂閱BELONGS_TO 1個DEFAULT_SUBSCRIPTION。本質上,該數字表示與默認訂閱相關的新訂閱數量。這有幫助嗎? – Ben 2012-02-24 01:59:40
Rails假設你正在做的幾乎每個方面都是面向對象的。鑑於它是MVC架構,對象(模型)幾乎是在MVC接口之間傳遞數據的要求。在你的情況下,我會創建一個臨時使用的模型和控制器(例如,將其稱爲UserEnteredSubscriptions)。該模型將用於通過form_for機制將用戶輸入的數據從視圖中返回到控制器中。然後,您可以使用此臨時使用模型中的數據來創建適當的DEFAULT_SUBSCRIPTION和NEW_SUBSCRIPTIONS。然後刪除臨時對象。 – 2012-02-24 02:42:07
是的MVC通常是如此優雅,我不能真正找出一個優雅的方式來解決這個問題。這是一個好主意,謝謝你。任何其他想法? – Ben 2012-02-24 19:46:22