2011-12-23 15 views
7

सिनात्रा में, मैं यूआरएल क्वेरी स्ट्रिंग के माध्यम से कुंजी/मान पारित करने के लिए पैरा का उपयोग करता हूं। मैंने देखा कि मैं मूल्य प्राप्त करने के लिए कुंजी के रूप में एक स्ट्रिंग या प्रतीक का उपयोग कर सकता हूं। तो अगर यह है:मैं प्रतीक का उपयोग करके सिनात्रा पैराम्स का उपयोग कैसे करूं?

http://localhost:4567/x?a=1&b=2 

तब:

params[:a] # => "1" 
params["a"] # => "1" 
params.to_s # => '{"name"=>"x", "a"=>"1", "b"=>"2"}' 
params.class # => Hash 

मैं पैरामीटर बता सकते हैं एक हैश है। लेकिन यह हैश का एक आम व्यवहार प्रतीत नहीं होता है।

h = {"a" => "1", "b" => "2"} 
h["a"] # => "1" 
h[:a] # => nil 

क्या कोई बता सकता है कि यह सिनात्रा के माध्यम से कैसे प्राप्त किया जाता है?

उत्तर

16

source पढ़ने के लिए हमेशा एक अच्छा विचार है। विशेष रूप से, indifferent_params method

# Enable string or symbol key access to the nested params hash. 
def indifferent_params(params) 
    params = indifferent_hash.merge(params) 
    params.each do |key, value| 
    next unless value.is_a?(Hash) 
    params[key] = indifferent_params(value) 
    end 
end 

टिप्पणी राज्यों के रूप में, यह इस पद्धति (एक ही फाइल की line 704 पर लागू) कि params हैश को स्ट्रिंग और प्रतीक उपयोग की अनुमति देता है।

+1

मुझे नहीं पता कि यह रूबी के साथ संभव है, लेकिन यदि वे हैश एक्सेस विधि ('[]') को ओवरराइड कर सकते हैं, तो यह बेहतर होगा कि इस विधि को प्रतीकों को प्रतीकों को बदलने के बजाय प्रत्येक को डुप्लिकेट करने की अनुमति न दें जोड़ी? यह अपेक्षाकृत महंगी डिज़ाइन पसंद की तरह लगता है कि यह क्या लाभ देता है। – MarioDS

+0

[वर्तमान कार्यान्वयन] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062) बहुत हल्का है: 'हैश.न्यू {| हैश, कुंजी | हैश [key.to_s] अगर प्रतीक === कुंजी} ', जिसका अर्थ है कि कुंजी एक प्रतीक है, तो कुंजी के स्ट्रिंग संस्करण के साथ प्रयास करें। –

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

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