2012-05-08 16 views
15

यहाँ में accepts_nested_attributes_for का उपयोग कर कैसे नेस्टेड विशेषताओं के लिए आदेश देने के बनाए रखने के लिए माता-पिता मॉडल है:जब एक रेल आवेदन

class Phase < ActiveRecord::Base 
    ... 
    has_many :type_well_phases 
    ... 
end 

मैं सभी रिकॉर्ड्स को कॉपी करके बाल तालिका (TypeWellPhases) में नेस्टेड रिकॉर्ड जोड़ता हूं मेरे चरणों (चरण मॉडल) माता-पिता मॉडल के नियंत्रक में टेबल हूँ जिन्हें आप नीचे देख:

class TypeWellsController < ResourceController 
    ... 
    def new 
    @new_heading = "New Type Well - Computed" 
    @type_well = TypeWell.new 
    initialize_phase_fields 
    end 

    private 

    def initialize_phase_fields 
    Phase.order("id").all.each do |p| 
     type_well_phase    = @type_well.type_well_phases.build 
     type_well_phase.phase_id  = p.id 
     type_well_phase.gw_heat_value = p.gw_heat_value 
    end 
    end 
    ... 
end 

मैं यह कर, क्योंकि मैं बच्चों के खेतों जोड़ रहे हैं कि द्वारा एक विशेष क्रम बनाए रखना चाहते हैं। कोड Phase.order ("id") का हिस्सा उस के लिए है क्योंकि चरण तालिका में ये रिकॉर्ड एक विशिष्ट क्रम में हैं।

इस के बाद मैं के रूप में मेरे प्रपत्र आंशिक में नीचे दिखाया गया simple_form_for और simple_fields_for सहायकों का उपयोग करें:

= simple_form_for @type_well do |f| 
    ... 
    #type_well_phases 
     = f.simple_fields_for :type_well_phases do |type_well_phase| 
     = render "type_well_phase_fields", :f => type_well_phase 

सब कुछ वांछित के रूप में काम करता है; अधिकांश समय। हालांकि, कभी-कभी इसे सहेजने के बाद फॉर्म में बाल पंक्तियों का क्रम गड़बड़ हो जाता है। इस एप्लिकेशन में ऑर्डर महत्वपूर्ण है इसलिए मैं स्पष्ट रूप से नियंत्रक में निजी विधि में यह आदेश करता हूं।

मैं बाल रिकॉर्ड हटाने के लिए "कोकून" मणि का उपयोग कर रहा हूं। मुझे यकीन नहीं है कि यह आदेश कभी-कभी गड़बड़ क्यों हो जाता है।

इतनी लंबी पोस्ट के लिए खेद है, लेकिन मैं सामने सभी प्रासंगिक विवरण प्रदान करना चाहता था।

किसी भी पॉइंटर्स की सराहना करें।

भारत

उत्तर

38

मैं आपको एक अधिक सामान्य तरीके से समझाऊंगा।

= form_for @product do |f| 
    ... 
    = f.fields_for :orders do |order_fields| 
     = order_fields.text_field :name 

आप चाहते हैं अपने आदेश नाम के अनुसार क्रमबद्ध किया जाना है तो सिर्फ उन्हें सॉर्ट :)

के बजाय:

= f.fields_for :orders do |order_fields| 

पुट:

कहो, आप उत्पाद और व्यवस्था मॉडल
= f.fields_for :orders, f.object.orders.order(:name) do |order_fields| 

जैसा कि आप देखते हैं, f वेरिएबल जोके ब्लॉक का पैरामीटर है 210 में विधि object है। यह आपका @ प्रॉडक्ट है, इसलिए आप .orders के माध्यम से अपने ऑर्डर प्राप्त कर सकते हैं और फिर .order(:name) के माध्यम से आवश्यक सॉर्टिंग लागू कर सकते हैं (इस छोटे भ्रम के लिए खेद है: ऑर्डर/ऑर्डर)।

आपके समाधान की कुंजी है कि आप fields_for के लिए दूसरे पैरामीटर के रूप में सॉर्ट किए गए ऑर्डर को पास कर सकते हैं।

पीएस सरल_फॉर्म मणि का उपयोग करने से मेरा समाधान प्रभावित नहीं होता है। अगर आप मददगारों को 'सरल_' जोड़ते हैं तो यह काम करेगा। बस मेरा जवाब दूसरों के लिए और अधिक सहायक होने के लिए और अधिक काम से संबंधित होना चाहता था।

+0

अपने उत्कृष्ट स्पष्टीकरण के लिए धन्यवाद। मेरे पास अभी एक फॉलो अप प्रश्न है: आप इसे कैसे जानते थे? मैंने प्रलेखन को पढ़ और पढ़ा और इसे भी नहीं सोचा। दूसरे शब्दों में, मुझे मछली को सिखाएं :) – Bharat

+0

कोई जादू नहीं है, @ भारत। यह सादे दृष्टि में आधिकारिक दस्तावेज में है। Http://api.rubyonrails.org/classes/ActionView/Helpers/FormHelper.html#method-i-fields_for पर जाएं और "या संग्रह का उपयोग करने के लिए" शब्दों पर स्क्रॉल करें। – jdoe

+0

ने मुझे अपना प्रश्न हल करने में मदद की http://stackoverflow.com/questions/13699285/how-to-make-text-fields-for-nested-attributes-in-rails-for-selected-records –

1

आप रेल 2.3.14 या उससे अधिक आप का उपयोग करने के प्रयोग कर रहे हैं:

f.fields_for :orders, f.object.orders.all(:order => :name) do |order_fields| 
संबंधित मुद्दे