2011-12-23 35 views
7

在Sinatra中,我使用params來獲取通過URL查詢字符串傳遞的鍵/值。我注意到我可以使用字符串或符號作爲獲取值的關鍵。因此,如果網址是:如何使用符號訪問Sinatra params?

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 

我可以告訴params爲一個Hash。但是這似乎並不是哈希的常見行爲。

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

有人可以解釋如何通過Sinatra實現嗎?

回答

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)要輕得多:'Hash.new {| hash,key | hash [key.to_s] if Symbol === key}',這意味着如果密鑰是符號,請嘗試密鑰的字符串版本。 –