2011-12-23 32 views
7

Ở Sinatra, tôi sử dụng các thông số để lấy khóa/giá trị được truyền qua chuỗi truy vấn URL. Tôi nhận thấy tôi có thể sử dụng một chuỗi hoặc một biểu tượng làm chìa khóa để lấy giá trị. Vì vậy, nếu URL là:Làm cách nào để truy cập vào tham số Sinatra bằng biểu tượng?

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

Sau đó:

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

tôi có thể nói params là một Hash. Nhưng điều này không có vẻ là một hành vi phổ biến của một Hash.

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

Ai đó có thể giải thích điều này có thể đạt được thông qua Sinatra không?

Trả lời

16

Luôn luôn có ý tưởng hay khi đọc được số source. Cụ thể, số 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 

Theo các tiểu bang nhận xét, đó là phương pháp này (gọi trên line 704 của cùng một tập tin) cho phép chuỗi và biểu tượng truy cập vào các params băm.

+1

Tôi không biết nếu điều này là có thể với ruby, nhưng nếu họ có thể ghi đè lên phương pháp truy cập băm ('[]'), nó sẽ không tốt hơn để cho phép phương pháp này để chuyển đổi ký hiệu thành chuỗi chứ không phải nhân bản đôi? Có vẻ như một sự lựa chọn thiết kế tương đối đắt tiền cho những lợi ích mà nó mang lại. – MarioDS

+0

[Triển khai hiện tại] (https://github.com/sinatra/sinatra/blob/6ce8a94005397695f0fd2cc241cd09fb325dd567/lib/sinatra/base.rb#L1060-L1062) nhẹ hơn nhiều: 'Hash.new {| hash, key | hash [key.to_s] nếu Symbol === key} ', có nghĩa là nếu khóa là một Symbol, hãy thử với phiên bản String của khóa. –

Các vấn đề liên quan