2012-02-24 59 views
1

我是rails新手,但不是編程或數據庫。Rails窗體和關聯 - 使用數量形式添加多個對象

我的問題在下面我的答案更好地評價。

對於該示例中簡單起見,我有3個模型: 用戶 認購 Default_Subscription

User has_many Subscriptions 
Subscription belongs_to User 

Default_Subscription has_many Subscriptions 
Subscription belongs_to Default_Subscription 

Default_Subscription是預填充的表與某些類型的訂閱。

在訂閱過程中,默認訂閱在一個點上列出,並且 是每個旁邊的數量框。

用戶輸入每個訂閱的數量並點擊提交繼續。

我的問題是: 如何創建一個數字形式的每個數量的新訂閱?

所以,你將有一個列表像這樣:

<ol> 
    <%= each subscription with quantity box %> 
</ol> 

<%= button_to %> 

當用戶點擊該按鈕,你怎麼從每箱加起來的數量,並添加新的訂閱爲每一個?我必須使用JavaScript來獲取數字嗎?即使這些數量與任何特定的數據庫字段沒有關聯,我是否也會使用rails表單?任何建議或指引我以正確的方向自行解決這個問題都會很好。

此表單框不是任何模型的字段,它是關聯計數。讓我改述一下:表單框中的每個數量表示要創建的新訂閱數量。每個訂閱BELONGS_TO 1個DEFAULT_SUBSCRIPTION。本質上,該數字表示與默認訂閱相關的新訂閱數量。

我使用的鐵軌3.2.1和1.8.7紅寶石

謝謝

回答

0

我已經找到了一種方法,並再次閱讀我的原始文章,整件事情非常混亂,因爲我不知道如何正確地說出我想要完成的事情。我必須說很多我困惑的原因是因爲我想要的表單與任何模型都不對應,只是一個關聯計數,如果你想創建一堆沒有屬性的新對象,它最終是一個基本的html表單然而。我會先澄清然後展示我的解決方案。

澄清:

我有2個表:

  1. 認購
  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開發人員非常善於記錄事物!

0

不知道我完全理解你的描述,但我會採取了一槍。

使用「的form_for」功能來構建表單,基於@default_subscription的實例(在你的控制器建立的「新」行動)。如果在@default_subscription中有默認值,將顯示在字段中,並且用戶可以根據他們認爲合適的方式更改它們。 (這裏假設你的DefaultSubscription模型有三個屬性:SUB1,SUB2和SUB3)

<%= form_for @default_subscription do |f| 
    <%= f.label :sub1 %><br /> 
    <%= f.number_field :sub1 %> 

    <%= f.label :sub2 %><br /> 
    <%= f.number_field :sub2 %> 

    <%= f.label :sub3 %><br /> 
    <%= f.number_field :sub3 %> 

<% end %> 

當用戶點擊提交按鈕的形式與我們組裝成一個散列並傳遞到控制器的「更新」的內容通過params []進行操作。您可以提取訂購散像這樣:

user_subscription = params[:default_subscription] 

此時你有一個用戶輸入到在user_subscription散列領域的所有數字。您現在可以解析哈希以提取數字,進行數學計算,然後根據用戶的輸入創建適當的訂閱。 (一注:這些數字可能是字符串,你可能需要將其轉換回整數作爲我如下圖所示。)

例如,以總價所有訂閱值和總保存到用戶的訂閱:

total = 0; 
user_subscription.each do |key, value| 
    total += value.to_i 
end 

new_sub = current_user.subscription.new 
new_sub.total = total 
new_but.save 

正如我所說,我並不清楚地瞭解你的描述,所以這可能不是有密切關係,但希望它接近你正在尋找的東西。

祝你好運。

+0

感謝您的詳細和有益的答案,因爲它澄清了一些其他的事情。這個表單框不是任何模型的字段,它是關聯的計數。讓我改述一下:表單框中的每個數量表示要創建的新訂閱數量。每個訂閱BELONGS_TO 1個DEFAULT_SUBSCRIPTION。本質上,該數字表示與默認訂閱相關的新訂閱數量。這有幫助嗎? – Ben 2012-02-24 01:59:40

+0

Rails假設你正在做的幾乎每個方面都是面向對象的。鑑於它是MVC架構,對象(模型)幾乎是在MVC接口之間傳遞數據的要求。在你的情況下,我會創建一個臨時使用的模型和控制器(例如,將其稱爲UserEnteredSubscriptions)。該模型將用於通過form_for機制將用戶輸入的數據從視圖中返回到控制器中。然後,您可以使用此臨時使用模型中的數據來創建適當的DEFAULT_SUBSCRIPTION和NEW_SUBSCRIPTIONS。然後刪除臨時對象。 – 2012-02-24 02:42:07

+0

是的MVC通常是如此優雅,我不能真正找出一個優雅的方式來解決這個問題。這是一個好主意,謝謝你。任何其他想法? – Ben 2012-02-24 19:46:22

相關問題