2011-08-16 9 views
54

मैं इस तरह रेल 3.0.9 में एक YAML फ़ाइल लोड हो रहा हूँ से हैश करने के लिए YAML और संदर्भ लोड:रेल प्रतीक

APP_CONFIG = YAML.load(File.read(File.expand_path('../app.yml', __FILE__))) 

यह लोड करता है श्रेणीबद्ध हैश, कोई समस्या नहीं की तरह सारी सामग्री को। जिस भाग को मैं पसंद नहीं करता वह तथ्य यह है कि हैश को केवल सिंगल या डबल कोट्स के साथ एक्सेस किया जा सकता है लेकिन प्रतीक नहीं।

APP_CONFIG['mailer']['username'] # works fine 
APP_CONFIG[:mailer][:username] # doesn't 

कोई विचार?

उत्तर

71

का उपयोग करके देखें HashWithIndifferentAccess

तरह
APP_CONFIG = HashWithIndifferentAccess.new(YAML.load(File.read(File.expand_path('../app.yml', __FILE__)))) 
+0

धन्यवाद दस लाख रोब। केवल यह सुनिश्चित करने में चाल थी कि रेल पहले ही लोड हो चुके थे। –

+2

ठीक लग रहा है लेकिन मैं ActiveSupport –

+0

<3 का उपयोग नहीं करता धन्यवाद! –

2

आप शायद रेल में पैरामीटर हैश, जो वास्तव में एक HashWithIndifferentAccess के बजाय एक मानक माणिक हैश वस्तु है करने के लिए उपयोग किया जाता है। यह आपको स्ट्रिंग्स जैसे 'एक्शन' या प्रतीकों का उपयोग करने की अनुमति देता है: सामग्री तक पहुंचने के लिए कार्रवाई।

हैशविथ इंडिफ़िफरेंस एक्सेस के साथ, आप जो भी उपयोग करते हैं उसके बावजूद आपको वही परिणाम मिलेंगे, लेकिन ध्यान रखें कि यह केवल हैशविथ इंडिफ़िफरएप ऑब्जेक्ट्स पर काम करता है।

तो YAML के साथ इस काम करने के लिए, तुम इतनी तरह एक HashWithIndifferentAccess में YAML.load का परिणाम लोड करने के लिए, होगा:

APP_CONFIG = HashWithIndifferentAccess.new( YAML.load(File.read(File.expand_path('../app.yml', __FILE__))) ) 
+0

अच्छी जानकारी @ टिलो (वाई) –

9

एक अन्य संभावित जवाब है, जबकि चारों ओर से खुदाई मुझे पता चला है।

आप के बजाय अपने YAML फ़ाइलों के शीर्ष करने के लिए इस जोड़कर HashWithIndifferentAccess.new छोड़ कर सकते हैं:

--- !map:HashWithIndifferentAccess 

तो बस सामान्य की तरह YAML.load। एकमात्र चाल यह है कि अगर आप इसे अपने पर्यावरण में शुरुआती उपयोग में उपयोग करने के लिए कर रहे हैं, तो रेलों को पहले ही लोड किया जाना चाहिए (जैसे मैं हूं)।

28

एक वैकल्पिक समाधान उन कुंजीयों को रखना है जिन्हें आप कोलन के साथ अनुक्रमित प्रतीक के रूप में एक्सेस करना चाहते हैं। उदाहरण के लिए:

default: &default 
    :symbol: "Accessed via a symbol only" 
    string: "Accessed via a string only" 

development: 
    <<: *default 

test: 
    <<: *default 

production: 
    <<: *default 

बाद में आप फिर इन इसलिए की तरह उपयोग कर सकते हैं:

APP_CONFIG[:symbol] 
APP_CONFIG['string'] 

ध्यान दें कि मैं YAML::ENGINE.yamler = "syck" उपयोग कर रहा हूँ। सुनिश्चित नहीं है कि यह psych के साथ काम करता है। का उपयोग कर इसे डुप्लिकेट चाबी बनाने के पक्ष प्रभाव पड़ता है: (साइक निश्चित रूप से कुंजी विलय का समर्थन करेंगे नहीं के रूप में मैं उदाहरण में दिखाया हालांकि।)

HashWithIndifferentAccess का उपयोग कर के बारे में प्रतीक का उपयोग के लिए एक और स्ट्रिंग पहुँच के लिए एक। यदि आप एरे के रूप में वाईएएमएल डेटा पास करते हैं तो यह घृणित हो सकता है। यदि आप उस समाधान के साथ जाते हैं तो इसके बारे में जागरूक रहें।

+0

यही मुझे चाहिए, धन्यवाद! –

+0

यह वास्तव में सही जवाब होना चाहिए। यह किसी के लिए स्पष्ट नहीं है कि वाईएएमएल गुण डिफ़ॉल्ट रूप से प्रतीकों के रूप में पार्स नहीं किए जाते हैं। –

23

यदि आप रेल पर रूबी में काम कर रहे हैं, तो आप symbolize_keys() पर एक नज़र डालना चाहते हैं, जो ओपी के लिए बिल्कुल पूछताछ करता है। यदि हैश गहरा है, तो आप deep_symbolize_keys() का उपयोग कर सकते हैं।इस दृष्टिकोण का उपयोग करना, इस सवाल का जवाब

APP_CONFIG = YAML.load(File.read(File.expand_path('../app.yml', __FILE__))).deep_symbolize_keys 
+0

यह नेस्टेड विशेषताओं –

+6

'deep_symbolize_keys()' नेस्टेड विशेषताओं को संभालना चाहिए के लिए काम नहीं करता है। – streetlogics

+0

अच्छा समाधान लेकिन यह ActiveSupport का हिस्सा है। लेकिन यह रेल का उपयोग करने के मामले में काम करता है –

12

है यह चयनित जवाब से ही है, लेकिन एक बेहतर वाक्य रचना के साथ:

YAML.load(File.read(file_path)).with_indifferent_access 
7
  1. रेल कुंजी का प्रतीक एक विशेष विधि है।
  2. आप load_file विधि का उपयोग कर सकते हैं और File.read
  3. से छुटकारा पाएं, सुनिश्चित नहीं है कि आपको expand_path की भी आवश्यकता है, तो डिफ़ॉल्ट निर्देशिका रेल रूट है।

मैं लिखते हैं सरल है कि:

YAML::load_file('app.yml').symbolize_keys

2

आप शुद्ध रूबी (जैसे कोई रेल) ​​का उपयोग कर रहे हैं, तो आप intermediately JSON प्रारूप को बदल सकता है। JSON lib की parse विधि कुंजी का प्रतीक हो सकती है।

http://ruby-doc.org/stdlib-2.0.0/libdoc/json/rdoc/JSON.html#method-i-parse

यहाँ मैं क्या मतलब है:

JSON.parse(JSON.dump(YAML.load_file(File.expand_path('../app.yml', __FILE__))), symbolize_names: true) 

नोट: यह करने के लिए और json से रूपांतरण की भूमि के ऊपर कहते हैं।

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