2012-04-30 4 views
5

私のフォームはPOSTでデータを受信します。私はputs paramsを行うと、私は見ることができます:シンボルを使用してSinatraパラメータを読み書きする。 params [:id]

{"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 

私はIRBそれで

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

を取得しますうまく動作します:

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

params[:id] 
# => nil 

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

なぜ私は:idを使用して値を読んで、それを使用して値を設定することはできませんか?

+0

質問params [:id]がparam idの値を読み取るのに対して、代入:idが新しい名前の下に新しい変数を作成するのはなぜですか –

答えて

12

Rubyのハッシュでは、任意のオブジェクトをキーとして使用できます。文字列(例えば、"id")や記号(例えば:id)は、オブジェクトの別の種類であるので、ハッシュは、両方のキー競合することなく同一の映像コンテンツの文字列や記号として有していてもよい:

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

これは明らかに異なっていますJavaScriptの場合、オブジェクトのキーは常に文字列です。

ウェブパラメータ(GETまたはPOSTを問わず)は常に文字列であるため、Sinatraはシンボルを使用してパラメータを尋ねることができ、関連する値を探す前に文字列に変換します。これは、存在しない値を検索するときにto_sを呼び出すカスタムdefault_procを使用して行います。ここで

current implementationです:

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

しかし、それは、[]=(key, val)メソッドのカスタム実装を提供していないので、あなたは、文字列の代わりにシンボルを設定することができます。

+0

ありがとう –

関連する問題