web-dev-qa-db-ja.com

Ruby on Railsでクエリ文字列であるかのように文字列を解析します

私はこのような文字列を持っています:

"foo=bar&bar=foo&hello=hi"

Does Ruby on Railsこれをクエリ文字列であるかのように解析するメソッドを提供しているので、次のようなハッシュを取得します。

{
    :foo => "bar",
    :bar => "foo",
    :hello => "hi"
}

それとも自分で書く必要がありますか?

編集

上記の文字列は、URLからの実際のクエリ文字列ではなく、Facebook ConnectのCookieに保存されている文字列であることに注意してください。

68
user142019

答えは、使用しているRailsのバージョンによって異なります。2.3以降を使用している場合は、パラメーターにRackの組み込みパーサーを使用します

 Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}

古いRailsを使用している場合は、CGI::parseを使用できます。ハッシュと配列の処理はモジュール間で微妙に異なるため、取得するデータが選択したメソッドに対して正しいかどうかを確認する必要があります。

Rack::Utilsをクラスに含めて、簡単にアクセスすることもできます。

150
Julik

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

あなたにあげる

{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
32
dombesz

パラメータに関するデータを取得するために使用されているURLについて話している場合

> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"

次に、クエリパラメータを取得します。使用する

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

編集:コメントで述べたように、誰かを傷つけたい場合、キーを同期化するとサーバーがダウンする可能性があります。ロープロファイルアプリで作業するときは、作業が簡単になるので、それでも多くのことをしますが、ハイステークアプリではもうしません。

希望する結果を得るためにキーをシンボル化することを忘れないでください

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

この操作は重複に対して破壊的です。

8
systho

ハッシュが必要な場合は、使用できます

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