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

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

你是在说对于哈希数据结构,:key 和 "key" 是相同的吗? - fred basset
在 Rails 解析请求头时,它会使用符号构建 params 哈希表,其中以 :starts_a_symbol 形式开始,用双引号括起来的字符串表示字符串。 - danh
好的,如果Rails从params中提取id,为什么是params[:id]而不是params["id"]? - fred basset
因为哈希表的键是符号。哈希表可以使用任何类型的对象作为键或值。符号通常用作键。 - danh
3个回答

16

Rails 使用 ActiveSupport 的 HashWithIndifferentAccess 来处理内部几乎所有的哈希表,比如params。一个 HashWithIndifferentAccess 与普通哈希表一样,但是通过符号或字符串访问相同“值”的键时返回相同的哈希表值。例如:

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"

这使您不必担心特定键是Symbol还是String(无论好坏)。


0

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


实际上,情况恰恰相反:HashWithIndifferentAccess 内部将符号键转换为字符串 - Andrew Marshall

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接