Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.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 在RubyonRails中解析字符串,就像它是查询字符串一样_Ruby On Rails_Parsing_Query String - Fatal编程技术网

Ruby on rails 在RubyonRails中解析字符串,就像它是查询字符串一样

Ruby on rails 在RubyonRails中解析字符串,就像它是查询字符串一样,ruby-on-rails,parsing,query-string,Ruby On Rails,Parsing,Query String,我有这样一个字符串: "foo=bar&bar=foo&hello=hi" { :foo => "bar", :bar => "foo", :hello => "hi" } Ruby on Rails是否提供了将其作为查询字符串进行解析的方法,因此我得到了如下哈希: "foo=bar&bar=foo&hello=hi" { :foo => "bar", :bar => "foo",

我有这样一个字符串:

"foo=bar&bar=foo&hello=hi"
{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}
Ruby on Rails是否提供了将其作为查询字符串进行解析的方法,因此我得到了如下哈希:

"foo=bar&bar=foo&hello=hi"
{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}
还是我必须自己写

编辑 请注意,上面的字符串不是来自URL的真正查询字符串,而是存储在Facebook Connect cookie中的字符串。

CGI::parse("foo=bar&bar=foo&hello=hi")
给你

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
编辑:
按照此版本的规定,同一个键有多个值,如果您也想解析数组,这很有用。

答案取决于您使用的Rails版本。如果您使用的是2.3或更高版本,请使用Rack的内置参数解析器

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
如果您使用的是较旧的Rails,那么确实可以使用
CGI::parse
。请注意,模块之间对散列和数组的处理方式略有不同,因此您需要验证所获取的数据是否适合所选的方法


您还可以将
Rack::Utils
包含到您的类中,以便进行速记访问。

编辑:如评论中所述,如果有人想伤害您,符号化密钥可能会使您的服务器停机。当我在低姿态的应用程序上工作时,我仍然经常这样做,因为这使事情更容易处理,但对于高风险的应用程序,我不会再这样做了

不要忘记用符号表示获得所需结果的关键点

Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys

此操作对重复项是破坏性的。

如果您谈论的是用于获取有关其参数的数据的URL

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"
然后获取查询参数。使用

> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}

如果你想要散列,你可以使用

Hash[CGI::parse(x).map{|k,v| [k, v.first]}]

这是我尝试过的唯一一个处理每个参数的多个实例的实现——谢谢!问题是,大多数人不想要数组,并且希望得到一个简单的key=>value响应。将用户提供的键符号化是个坏主意。符号不会GC,因此,如果有人用大量伪造的参数键垃圾邮件发送您的服务器,它将在某个时候耗尽进程内存。Ruby 2.2现在将使用GC符号。如果您想获得rails为您提供的params对象,您可以这样做:params=ActionController::Parameters.new(Rack::Utils.parse_nested_query(“a=2”))有人知道是否可以避免将查询字符串param值强制转换为字符串吗?e、 g.我想要这种行为:``Rack::Utils.raw#parse(嵌套查询(“a=2”)=>{a”=>2}``虽然大多数时候这很好:它将
“a[]=&a[]=z”
解析为
{a[]=>,“z”}
,而
ActionController::Base
实际使用的任何解析器都返回
{code>{a=>z]
Doc.transform_值(&:first)