我的网址如下:
http://localhost:3000/movies?ratings[PG-13]=1&commit=Refresh
我正在尝试评估网址参数,并且我不确定为什么这种方式有效。在我的控制器中,我评估参数并构建一个数组,如下所示:
在我的View
中,我使用以下调试语句来查看放入@selected_ratings
的内容
=debug(@selected_ratings)
在我的控制器中,我尝试了两个陈述。
测试1返回以下内容,这应该有效吗?
@selected_ratings = (params["ratings[PG-13]"].present? ? params["ratings[PG-13]"] : "notworking")
output: notworking
但是,如果我在控制器中使用以下三元评估:
@selected_ratings = (params["ratings"].present? ? params["ratings"] : "notworking")
output:!map:ActiveSupport::HashWithIndifferentAccess
PG-13: "1"
为什么我的评估无法找到文字params["ratings[PG-13]"]
?
答案 0 :(得分:5)
Rails将表单a[b]=c
的字符串参数解析为哈希[1],其中b
是一个键,c
是其关联值:{ :a => { :b => "c" } }
。
因此,网址http://localhost:3000/movies?ratings[PG-13]=1&commit=Refresh
将导致哈希:
{ :ratings => { :'PG-13' => "1"}, :commit => "Refresh" }
在您的第一个作业中,您检查是否存在params["ratings[PG-13]"]
,并且由于它不存在,它将返回" notworking"。在第二种情况下,您检查params["ratings"]
是否存在,它是,因此返回params["ratings"]
,这是一个包含密钥PG-13
和值"1"
的哈希。 / p>
[1]或者更确切地说是HashWithIndifferentAccess
,一种converts symbol and string keys into a single type的特殊哈希值。