2009-10-16 13 views
5

मुझे नेस्टेड मॉडल रूपों में समस्या है जिसमें रेडियो बटन होते हैं, जब मेरे पास कई मॉडल होते हैं तो सभी रेडियो बटनों को एक ही समूह में माना जाता है।कई नेस्टेड मॉडलों के साथ रेल फॉर्म रेडियो समूहों के साथ समस्याएं पैदा करता है

मेरे मॉडल इस तरह एक has_many संबंध शामिल हैं:

class Order < ActiveRecord::Base 
    has_many :order_items 
    accepts_nested_attributes_for :order_items 
end 

Class OrderItem < ActiveRecord::Base 
    belongs_to :order 
end 

मैं तो एक आंशिक कि OrderItem मॉडल

<% fields_for "order[order_items_attributes][]", order_item do |f| %> 

और इस फार्म के भीतर निहित का उपयोग कर प्रपत्र बनाता है रेडियो बटन का एक समूह है

radio_button_tag "order[order_items_attributes][][colour_id]", "#{colour.id}" 

टी के साथ पाश के लिए एक के अंदर बनाया जब केवल एक बच्चा होता है तो उसका काम ठीक होता है, हालांकि जैसे ही मैं कई बच्चों को सम्मिलित करता हूं, सभी रेडियो बटन एक ही समूह के होते हैं क्योंकि उनके पास एक ही विशेषता name="order[order_items_attributes][][colour_id]" है। यह सब एक नए मॉडल रूप पर है, इसलिए मैं सर इंडेक्स (name="order[order_items_attributes][0][colour_id]") का उपयोग नहीं कर सकता क्योंकि रेल त्रुटि expected Hash (got Array) for param 'order_items_attributes'मैं उस अंतिम भाग के बारे में गलत था, त्रुटि इसलिए थी क्योंकि मैं अनुक्रमित और गैर अनुक्रमित नाम विशेषताओं को मिला रहा था। इंडेक्स वैल्यू जोड़ना इसे हल करने की कुंजी थी। पहले

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"}, 
    {"size"=>"Small"}], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

आप केवल देख सकते हैं:

यहाँ params[:order] हैश की सामग्री को जब केवल एक नेस्टेड मॉडल मौजूद है:

{"order_items_attributes"=> 
    [{"size"=>"Small", 
    "colour_id"=>"4"], 
"first_name"=>"sdf", 
"last_name"=>"sdf", 
"email"=>"[email protected]"} 

और जब दो नेस्टेड मॉडल मौजूद हैं order_item में यह colour_id विशेषता है। यह तब भी होता है जब चयनित रेडियो बटन का कौन सा मॉडल संबंधित होता है (जो समझ में आता है)।

मैं रेडियो बटन कैसे प्रस्तुत कर सकता हूं जैसे कि यह प्रत्येक बच्चे मॉडल के लिए एक अलग समूह बनाता है?

+0

यदि आप पैराम्स [: ऑर्डर] हैश की सामग्री पेस्ट कर सकते हैं तो मामले में केवल 1 नेस्टेड ऑर्डर_इटम (यानी मामला जो काम करता है) और उस मामले के लिए जहां 1 से अधिक नेस्टेड ऑर्डर_इटम है (यानी वह मामला जहां यह काम नहीं करता है)। दोनों उदाहरणों के लिए, स्टैक ओवरफ़्लो में पेस्ट करने से पहले पैरा को [: ऑर्डर] हैश को सुंदर प्रिंट के माध्यम से चलाएं। – nelstrom

उत्तर

3

जब आप field_for कहते हैं तो आपको प्रत्येक ऑर्डर आइटम को एक अद्वितीय अनुक्रमणिका देना होगा। यदि आप इस तरीके से field_for कॉल कर रहे हैं, तो आपको फ़ील्ड_for पर जाने वाले सरणी के सूचकांक का ट्रैक रखना होगा। घोंसला वाले रूपों का उपयोग करके रेल आपके लिए यह कर सकते हैं।

समाधान नेस्टेड रूपों का उपयोग करना है।

<%form_for :order do |f|%> 
    Form stuff for this particular order. 
    If @order.order_items is empty you may need to build one before the next line. 
    <%f.fields_for :order_items do |oi_f| %> 
    Form stuff for this particular order_item (prefixed with oi_f.) 
    <%Colour.all.each do |colour| %> 
     <%=oi_f.radio_tag(:colour_id, colour.id)%> 
    <%end%> 
    <%end%> 
<%end%> 

ऐसा लगता है आप orders_controller को पोस्ट कर रहे हैं की तरह तो यह प्रतिस्थापन में एक बूंद होना चाहिए।

+0

धन्यवाद, यह बिल्कुल ठीक था! मैंने फ़ायरबग का उपयोग करके मैन्युअल रूप से इंडेक्स वैल्यू जोड़ने की कोशिश की थी, लेकिन मैंने जो त्रुटि का उल्लेख किया था उसे प्राप्त कर रहा था, यह पता चला क्योंकि मेरे पास अन्य फॉर्म फ़ील्ड थे और इंडेक्स और गैर-अनुक्रमित नाम विशेषताओं को मिश्रित कर रहे थे। – roryf

संबंधित मुद्दे