【问题标题】:Rails: Case insensitive params hash keys? [duplicate]Rails:不区分大小写的参数哈希键? [复制]
【发布时间】:2014-02-11 23:22:42
【问题描述】:

Rails 中的 params 哈希能否将键标准化为不区分大小写?

如果 Rails 收到带有以下查询参数的 GET 请求 http://localhost.com:3000/username?debug=true&vErBoSe=true

params[:verbose] 将是 nil,您需要使用 params[:vErBoSe] 来获取值。

【问题讨论】:

  • 与链接问题不同,params 哈希来自系统外部,通过 URL 或 POST 正文。处理此问题的一种简单方法是在控制器中对其进行调整。 Ruby 2.5 引入了Hash#transform_keys!,这将允许一个简单的params.transform_keys! { _1.downcase }

标签: ruby-on-rails ruby


【解决方案1】:

一种选择是在访问其值之前将参数哈希转换为不区分大小写处理键的哈希。

Ryan McGeary 在https://stackoverflow.com/a/2030565/454094 有一个不区分大小写哈希的示例实现,我在下面复制了它:

require "active_support/hash_with_indifferent_access"

class CaseInsensitiveHash < HashWithIndifferentAccess
  # This method shouldn't need an override, but my tests say otherwise.
  def [](key)
    super convert_key(key)
  end

  protected

  def convert_key(key)
    key.respond_to?(:downcase) ? key.downcase : key
  end  
end

有了它,你可以做到:

CaseInsensitiveHash.new(params)[:verbose]

【讨论】:

    【解决方案2】:

    最好使键简单并遵循约定。通过使所有键小写/小写。如果您需要一个值,则将变量小写,然后将其传递给哈希。

    哈希:

    params = {key: 'Hello', another_key: 'World'}
    

    那么你可以这样使用它:

    params[var.downcase]
    

    【讨论】:

    • 听起来你是在说添加所有小写的键,但问题要求哈希已经由 URL 的 rails 生成的情况......这意味着这不是一个选项!
    • 我明白问题在说什么。而我的回答还是一样。作为一名资深的 Rails 开发人员,我还不需要将 uri 小写,从他的示例 localhost url 来看,这表明他正在做大写。所以这个问题就像“我如何使用 goto 而不是意大利面条代码?”。答案是,不要使用 goto。为此,首先不要使用大写参数。
    猜你喜欢
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2010-09-23
    • 1970-01-01
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    相关资源
    最近更新 更多