J'ai une chaîne comme celle-ci:
"foo=bar&bar=foo&hello=hi"
Ruby on Rails fournit des méthodes pour analyser ceci comme s'il s'agissait d'une chaîne de requête, donc j'obtiens un hachage comme ceci:
{
:foo => "bar",
:bar => "foo",
:hello => "hi"
}
Ou dois-je l'écrire moi-même?
Veuillez noter que la chaîne ci-dessus n'est pas une véritable chaîne de requête à partir d'une URL, mais plutôt une chaîne stockée dans un cookie de Facebook Connect.
La réponse dépend de la version de Rails que vous utilisez. Si vous utilisez la version 2.3 ou ultérieure, utilisez l'analyseur intégré de Rack pour les paramètres
Rack::Utils.parse_nested_query("a=2") #=> {"a" => "2"}
Si vous utilisez des Rails plus anciens, vous pouvez en effet utiliser CGI::parse
. Notez que la gestion des hachages et des tableaux diffère de manière subtile entre les modules, vous devez donc vérifier si les données que vous obtenez sont correctes pour la méthode que vous choisissez.
Vous pouvez également inclure Rack::Utils
dans votre classe pour un accès raccourci.
Le
CGI::parse("foo=bar&bar=foo&hello=hi")
Vous donne
{"foo"=>["bar"], "hello"=>["hi"], "bar"=>["foo"]}
Si vous parlez des URL qui sont utilisées pour obtenir des données sur les paramètres eux
> request.url
=> "http://localhost:3000/restaurants/lokesh-dhaba?data=some&more=thisIsMore"
Ensuite, pour obtenir les paramètres de requête. utilisation
> request.query_parameters
=> {"data"=>"some", "more"=>"thisIsMore"}
Edit: comme indiqué dans les commentaires, les clés de symolisation peuvent faire tomber votre serveur si quelqu'un veut vous blesser. Je le fais toujours beaucoup lorsque je travaille sur des applications à profil bas, car cela facilite les choses, mais je ne le ferais plus pour les applications à fort enjeu
N'oubliez pas de symboliser les touches pour obtenir le résultat souhaité
Rack::Utils.parse_nested_query("a=2&b=tralalala").deep_symbolize_keys
cette opération est destructrice pour les doublons.
Si vous voulez un hachage, vous pouvez utiliser
Hash[CGI::parse(x).map{|k,v| [k, v.first]}]