2012-04-30 27 views
5

Biểu mẫu của tôi nhận dữ liệu qua POST. Khi tôi làm puts params tôi có thể thấy:Đọc và viết các tham số Sinatra bằng ký hiệu, ví dụ: params [: id]

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

nay là lệnh:

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

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

nhưng khi tôi làm:

params[:id] = '888' 
puts params 

tôi nhận được

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

Trong IRB nó hoạt động tốt:

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

params[:id] 
# => nil 

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

Tại sao tôi có thể đọc giá trị bằng cách sử dụng :id, nhưng không đặt giá trị bằng cách sử dụng?

+0

câu hỏi là lý do tại sao params [: id] đọc giá trị cho id tham số, trong khi gán: id tạo biến mới dưới tên mới –

Trả lời

12

Dấu gạch ngang trong Ruby cho phép các đối tượng tùy ý được sử dụng làm khóa. Như chuỗi (ví dụ "id") và biểu tượng (ví dụ :id) là loại riêng biệt của các đối tượng, một băm có thể có như một chìa khóa cả một chuỗi và biểu tượng với những nội dung hình ảnh tương tự mà không mâu thuẫn:

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

Đây là khác biệt rõ rệt từ JavaScript, nơi các khóa cho các đối tượng luôn là chuỗi.

Vì thông số web (dù qua GET hoặc POST) luôn là chuỗi, Sinatra có 'tiện lợi' cho phép bạn yêu cầu tham số bằng ký hiệu và chuyển đổi thành chuỗi trước khi tìm giá trị được liên kết . Nó thực hiện điều này bằng cách sử dụng default_proc tùy chỉnh gọi to_s khi tìm kiếm một giá trị không tồn tại.

Đây là current implementation:

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

Tuy nhiên, nó không cung cấp một cài đặt tùy chỉnh cho phương pháp []=(key, val), và do đó bạn có thể đặt một biểu tượng thay vì chuỗi.

+0

cảm ơn bạn rất nhiều –

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