Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中解析URL查询中的多值字段_Ruby On Rails_Ruby_Http - Fatal编程技术网

Ruby on rails 如何在Rails中解析URL查询中的多值字段

Ruby on rails 如何在Rails中解析URL查询中的多值字段,ruby-on-rails,ruby,http,Ruby On Rails,Ruby,Http,我有一个form的URLhttp://www.example.com?foo=one&foo=two 我想为foo获取一个值数组['one','two'],但是params[:foo]只返回第一个值 我知道如果我在URL中使用foo[]而不是foo,那么params[:foo]将为我提供所需的数组 但是,如果可能的话,我希望避免更改URL的结构,因为它的形式是作为客户机应用程序的规范提供的。有没有一种不更改参数名就获取所有值的好方法?您可以使用默认的Ruby CGI模块在Rails控制器中解析查

我有一个
form的URLhttp://www.example.com?foo=one&foo=two

我想为
foo
获取一个值数组
['one','two']
,但是
params[:foo]
只返回第一个值

我知道如果我在URL中使用
foo[]
而不是
foo
,那么
params[:foo]
将为我提供所需的数组


但是,如果可能的话,我希望避免更改URL的结构,因为它的形式是作为客户机应用程序的规范提供的。有没有一种不更改参数名就获取所有值的好方法?

您可以使用默认的Ruby CGI模块在Rails控制器中解析查询字符串,如下所示:

params = CGI.parse(request.query_string)
这将为您提供所需的内容,但请注意,您不会获得任何其他用于查询字符串解析的扩展,例如使用
hashwithindepertaccess
,因此您必须使用字符串而不是符号键

另外,我不相信您可以用一行代码设置那样的参数,并覆盖默认的rails参数内容。根据您希望这种更改的广泛程度,您可能需要对内部进行一些修补或修改。但是,如果您想要进行全局更改,最快捷的方法是将其放入
application.rb
中的before过滤器中,并使用一个新的实例变量,如
@raw\u params

我喜欢另一个答案中提到的CGI.parse(request.query\u string)解决方案。您可以这样做,将自定义解析的查询字符串合并到参数中:

params.merge!(CGI.parse(request.query_string).symbolize_keys)

很有魅力,谢谢。我只需要把它放在一个控制器的一个地方,所以我甚至不需要乱动params。自动符号化会让你的应用受到DoS攻击。Ruby从不垃圾收集符号实例,因此它们留在内存中,什么也不做,直到应用程序重新启动。@FrançoisBeausoleil-你有更详细解释这个问题的链接吗?在Ruby 1.9.2/Rails 3中,这仍然是一个问题吗?@matthugins-See。这个问题应该在2.2中解决。