2012-10-15 103 views
0

我的网址如下:Evaulating网址参数,没有返回预期的结果

http://localhost:3000/movies?ratings[PG-13]=1&commit=Refresh 

我尝试评估网址参数和我不能确定为什么这种工作方式是一样。在我的控制器我评价参数和如下建立一个数组:

在我View我用下面的调试语句,看看有什么被放入@selected_ratings

=debug(@selected_ratings) 

在我的控制器中我已经试过两种说法。

测试一返回以下,这应该工作?

@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]"]

回答

5

Rails将表格a[b]=c的字符串参数解析为散列[1],其中b是关键字,c是其关联值:{ :a => { :b => "c" } }

所以URL 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"的散列。

[1]或者更确切地说,一个HashWithIndifferentAccess,一种特殊的散列converts symbol and string keys into a single type

+0

所以我应该做'params [“ratings”]。has_key(“PG-13”)'?坚韧,如何搜索散列,当值是另一个散列...... – ProfessionalAmateur

+0

你不能只测试'params [“ratings”] [“PG-13”]'?在这种情况下,它将返回一个“1”,作为布尔值将为true。如果密钥不存在,它将返回'nil'。你也许应该添加一个检查“params [”rating“]'不是零。 –

+0

啊我不知道我可以这么做,'params [“rating”] [“PG-13”]'。我是全新的rails/ruby​​ ...我将不得不更多地使用它。谢谢您的帮助。 – ProfessionalAmateur