2012-04-30 5 views
5

मेरा फॉर्म POST के माध्यम से डेटा प्राप्त करता है। जब मैं puts params करना मैं देख सकता हूँ:प्रतीकों का उपयोग करके सिनात्रा पैरा को पढ़ना और लिखना, उदा। पैराम्स [: आईडी]

{"id" => "123", "id2" => "456"} 
अब

कमांड:

puts params['id'] # => 123 
puts params[:id]  # => 123 

params['id'] = '999' 
puts params   # => {"id" => "999", "id2" => "456"} 

लेकिन जब मैं कार्य करें:

params[:id] = '888' 
puts params 

मैं

{"id" => "999", "id2" => "456", :id => "888"} 

इसे आईआरबी में ठीक काम करता है:

params 
# => {"id2"=>"2", "id"=>"1"} 

params[:id] 
# => nil 

params['id'] 
# => "1" 

मैं क्यों :id का उपयोग कर मूल्य पढ़ सकते हैं, लेकिन यह है कि का उपयोग कर मान सेट नहीं?

+0

सवाल यह है कि पैराम [id] पैरामीटर आईडी के लिए मान पढ़ता है, जबकि असाइनमेंट: आईडी नए नाम के तहत नया चर बनाता है –

उत्तर

12

रूबी में हैश मनमाने ढंग से वस्तुओं को कुंजी के रूप में उपयोग करने की अनुमति देते हैं।

irb(main):001:0> { :a=>1, "a"=>2 } 
#=> {:a=>1, "a"=>2} 

यह स्पष्ट रूप से भिन्न है: जैसा कि तार (जैसे "id") और प्रतीकों (जैसे :id) वस्तुओं की अलग प्रकार के होते हैं, एक हैश एक प्रमुख दोनों एक स्ट्रिंग और प्रतीक एक ही दृश्य सामग्री के साथ बिना किसी संघर्ष के रूप में हो सकता है जावास्क्रिप्ट से, जहां वस्तुओं के लिए कुंजी हमेशा तार होते हैं।

क्योंकि वेब पैरामीटर (चाहे जीईटी या पोस्ट के माध्यम से) हमेशा तार होते हैं, सिनात्रा के पास 'सुविधा' होती है जो आपको प्रतीक का उपयोग करके पैरामीटर मांगने की अनुमति देती है और यह संबंधित मूल्य की तलाश करने से पहले इसे एक स्ट्रिंग में परिवर्तित कर देगी । यह एक कस्टम default_proc का उपयोग करके करता है जो to_s पर कॉल करता है जब कोई मान नहीं दिखता है। हालांकि, यह []=(key, val) विधि की कस्टम कार्यान्वयन प्रदान नहीं करता है

def indifferent_hash 
    Hash.new {|hash,key| hash[key.to_s] if Symbol === key } 
end 

, और इस तरह आप स्ट्रिंग के बजाय एक प्रतीक सेट कर सकते हैं:

यहाँ current implementation है।

+0

आपको बहुत धन्यवाद –

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