【问题标题】:Rails parameters, why the params[:key] syntax?Rails 参数,为什么是 params[:key] 语法?
【发布时间】:2013-01-27 21:24:07
【问题描述】:

我正在尝试手动创建一些参数以传递给 Rails 控制器函数,为什么用冒号列出参数哈希的键,例如params[:key] 而不是params["key"]

【问题讨论】:

  • 你是说 :key 和 hash 数据结构的 "key" 一样吗?
  • :starts_a_symbol while "quotes_delimit_strings"。当 rails 解析请求头时,它会使用符号构建 params 哈希。
  • 好的,如果 rails 说从 params 中提取 id,那为什么是 params[:id] 而不是 params["id"]?
  • 因为该哈希的键是符号。 hash 可以使用任何类型的对象作为键或值。符号通常用作键。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

Rails 将ActiveSupport’s HashWithIndifferentAccess 用于几乎所有来自其自身的哈希值,例如paramsHashWithIndifferentAccess 的行为与常规哈希相同,只是通过相同“值”的符号或字符串的键访问返回相同的哈希值。例如:

h = HashWithIndifferentAccess.new
h[:foo] = 'bar'
h[:foo]  #=> "bar"
h['foo'] #=> "bar"

h['foo'] = 'BAR'
h[:foo]  #=> "BAR"

对比一个普通的哈希:

h = {}
h[:foo] = 'bar'
h[:foo]  #=> "bar"
h['foo'] #=> nil

h['foo'] = 'BAR'
h[:foo]  #=> "bar"

这使您不必担心(无论好坏)特定键是符号还是字符串。

【讨论】:

    【解决方案2】:

    哈希使用符号作为键,因为每个符号总是只有一个实例,这使得搜索更容易。使用字符串时,必须计算哈希,因为它不能是相同的字符串(另一个实例,但具有相同的内容)。所以它使它更快。主动支持HashWithIndifferentAccess 将使用#to_sym 方法将所有字符串转换为符号。

    【解决方案3】:

    在大多数情况下,字符串(带引号)和符号(带冒号)在 Rails 中可以作为哈希键互换。当哈希键是预定义的常量时,它们是惯用的。 Ruby 1.9 具有用于编写带有键符号的哈希的语法糖。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-30
      • 2015-04-18
      • 2013-06-27
      • 2015-08-03
      相关资源
      最近更新 更多