2011-08-30 8 views
6

मुझे पता है कि वैश्विक स्तर पर रूट तत्व को कैसे अक्षम किया जाए, एक ला Rails 3.1 include_root_in_json या ActiveRecord::Base.include_root_in_json = false का उपयोग करके, लेकिन मैं केवल कुछ JSON अनुरोधों (वैश्विक स्तर पर नहीं) के लिए ऐसा करना चाहता हूं।रेल: केवल विशिष्ट नियंत्रक कार्यों के लिए JSON में रूट अक्षम करें?

अब तक, मैं इसे इस तरह कर रहा हूँ:

@donuts = Donut.where(:jelly => true) 
@coffees = Coffee.all 
@breakfast_sandwiches = Sandwich.where(:breakfast => true) 

dunkin_donuts_order = {} 
dunkin_donuts_order[:donuts] = @donuts 
dunkin_donuts_order[:libations] = @coffees 
dunkin_donuts_order[:non_donut_food] = @breakfast_sandwiches 

Donut.include_root_in_json = false 
Coffee.include_root_in_json = false 

render :json => dunkin_donuts_order 

Donut.include_root_in_json = true 
Coffee.include_root_in_json = true 

के बारे में 5 मामलों में जहां मैं एक से अधिक मॉडल के साथ कभी कभी यह करने के लिए, हो रहे हैं, और यह साफ महसूस नहीं करता है सब। मैंने इसे around_filter एस में डालने की कोशिश की थी, लेकिन अपवाद प्रवाह को तोड़ रहे थे, और वह बालों को भी मिल रहा था।

एक बेहतर तरीका होना चाहिए!

+0

यह सीधे आपके प्रश्न का उत्तर नहीं देता है, लेकिन यह उस व्यक्ति का उत्तर देता है जो मैं यहां देख रहा था: आप व्यक्तिगत कॉल पर रूट को 'to_json'' पर दबा सकते हैं, उदा। 'Donut.to_json (रूट: झूठा)' – Lambart

उत्तर

2

उत्तर दुर्भाग्य से, हाँ और नहीं है।

हां, आपने जो किया है, वह तर्कसंगत रूप से बेहतर किया जा सकता है। नहीं, रेल आपको प्रति-क्रिया के आधार पर रूट जोड़ने नहीं देंगे। जेएसओएन प्रतिपादन सिर्फ उस तरह की लचीलापन के साथ दिमाग में नहीं बनाया गया था।

कहा जा रहा है, यहाँ मैं क्या चाहते हैं क्या करना है:

  1. include_root_in_json उन मॉडलों जो जड़ कार्रवाई पर निर्भर करता है (जैसे Donut और Coffee ऊपर के रूप में) के लिए false के लिए सेट।
  2. अधिक लचीलापन की अनुमति देने के लिए as_json ओवरराइड करें।

    # in model.rb 
    def as_json(options = nil) 
        hash = serializable_hash(options) 
        if options && options[:root] 
         hash = { options[:root] => hash } 
        else 
         hash = hash 
        end 
    end 
    

    यह उदाहरण यह इतना है कि आप वैकल्पिक रूप से कोई रूट में एक रूट लेकिन चूक पारित कर सकते हैं होगा: यहाँ एक उदाहरण है। आप वैकल्पिक रूप से इसे दूसरी तरफ लिख सकते हैं।

  3. चूंकि आप as_json को ओवरराइड करते हैं, तो आपको उचित रूप से अपनी रेंडर कॉल संशोधित करना होगा। तो, Donut के लिए, आप render :json => @donut.to_json करेंगे।

उम्मीद है कि इससे मदद मिलती है!

+0

धन्यवाद। मैंने पैर में खुद को शूटिंग बंद कर दिया और [आरएबीएल] (https://github.com/nesquena/rabl) पर स्विच किया और कभी पीछे नहीं देखा। बहुत बेहतर! – neezer

+0

अच्छा जवाब। लेकिन आपको as_json()। to_json को कॉल करने की आवश्यकता नहीं है क्योंकि to_json स्वचालित रूप से आपके as_json ओवरराइड को कॉल करता है। –

+0

धन्यवाद, @NadaAldahleh। मैंने अपने जवाब में थोड़ा सा स्पष्ट किया है। –

1

आप include_root_in_json मॉडल प्रति उदाहरण सेट कर सकते हैं, और यह (इस व्यवहार के वर्णन के लिए देख class_attribute रेल एपीआई में) वर्ग के प्रभावित नहीं करेगा। तो आप वर्ग स्तर पर एक समझदार डिफ़ॉल्ट मान सेट कर सकते हैं, फिर प्रासंगिक नियंत्रकों में प्रत्येक उदाहरण पर एक अलग मान सेट करें।

उदाहरण:

@donuts = Donut.where(:jelly => true).each {|d| d.include_root_in_json = false } 

सुविधा के लिए, यदि आप एक उपयोगिता विधि है कि मॉडल उदाहरणों की एक सरणी स्वीकार करता है और उन सभी को पर मूल्य सेट बना सकते हैं।

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