Rails参数,为什么params [:key]语法?

时间:2013-01-27 21:24:08

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

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

3 个答案:

答案 0 :(得分:16)

Rails使用ActiveSupport’s HashWithIndifferentAccess几乎所有来自内部的哈希值,例如params。除了符号或相同“值”的字符串的键访问返回相同的哈希值之外,HashWithIndifferentAccess的行为与常规哈希相同。例如:

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

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

VS。普通哈希:

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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