【问题标题】:How do I access Sinatra params using a symbol?如何使用符号访问 Sinatra 参数?
【发布时间】:2013-05-15 15:23:06
【问题描述】:

在 Sinatra 中,我使用参数来获取通过 URL 查询字符串传递的键/值。我注意到我可以使用字符串或符号作为获取值的键。所以如果网址是:

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 实现的?

【问题讨论】:

    标签: sinatra


    【解决方案1】:

    阅读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 哈希。

    【讨论】:

    • 我不知道 ruby​​ 是否可以做到这一点,但是如果他们可以覆盖哈希访问方法([]),那么允许这种方法将符号转换为字符串不是更好吗而不是复制每一对?就它所带来的好处而言,这似乎是一个相对昂贵的设计选择。
    • current implementation 要轻得多:Hash.new {|hash,key| hash[key.to_s] if Symbol === key },这意味着如果键是符号,请尝试使用键的字符串版本。
    猜你喜欢
    • 1970-01-01
    • 2012-12-09
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    相关资源
    最近更新 更多