11
votes

Comment obtenir des params d'URL avec WhitSpace comme '% 20' au lieu de '+' dans les rails

Si j'ai ces paramètres pour ajouter à l'URL

params = {nom: 'John Key'} code> p>

et utilisez la méthode to_param Code>: P>

params.to_param
 => "name=John+Key"


2 commentaires

Vous avez mal interprété les réponses à la question liée. Dans Query Plus les signes sont parfaitement valables, traités comme des espaces et donc il n'existe donc pas d'assistant de rails redondants existant.


J'ai besoin des paramètres d'une URL de typeForm. Il ne traite pas bien le '+', mais cela fait avec '% 20'


6 Réponses :


1
votes

Avez-vous essayé d'utiliser uri ? par exemple.

nécessite "Uri" Uri.Escape ('John Smith')

Le résultat dans cet exemple devrait être Jean% 20mith

réalisé à partir d'un autre poste que URI.Escape est techniquement obsolète. Où h est syntonique de hachage et k est la clé du hachage, essayez ceci:

params.keys.inject ({}) {| h, k | h [k] = erb :: util.url_encode (paramètres [k]); h}


1 commentaires

Oui, cela fonctionne pour la valeur d'un param. Mais dans ce cas, je veux obtenir un groupe d'paramètres avec '% 20'. Comme_param méthode mais ne retourne pas les espaces blouses avec '+' Nom = John% 20Key



7
votes

Je recommanderais simplement de rester à l'utilisation d'un gsub , peut-être avec un commentaire pour expliquer la nécessité d'un tel comportement.

pendant que vous pourriez résoudre le problème En utilisant uri.escape , il est censé être obsolète, car il n'est pas entièrement conforme aux spécifications RFC. voir ici pour une excellente radiation sur elle.

hachage # to_param est un alias de hash # to_query , qui appelle objet # to_query . L'exemple le plus simple pour démontrer ce + vs % 20 est: xxx

la mise en œuvre de objet # to_query est: xxx

et donc, nous constatons que: xxx

donc, c'est pourquoi je ont référencé les différences entre cgi.escape et uri.escape .


0 commentaires

4
votes

Que diriez-vous de

URI.encode 'John Smith'
# => John%20Smith


0 commentaires

3
votes

Pas vraiment.

suggère d'utiliser: your_params_hash.to_query.gsub ("+", "% 20")


0 commentaires

1
votes

Élargir sur la réponse de Julie pour atteindre la chaîne de valeurs codées plutôt qu'à un hachage.

avec l'amortissement de uri.encode code> Il est possible d'y parvenir avec erb :: util .url_encode code>, toutefois, vous devez coder uniquement la clé et la valeur des paires, et non le paramètre complet, puis joignez-les ensemble. p>


params.to_query

# => "Bad+Key=but+works&name=John+Key&occupation=Web+Developer%21"


0 commentaires

0
votes

Si vous voulez un pour cent littérale encodage d'une chaîne sans contexte (par exemple pour RFC 5987 encodage de quelque chose comme un Content-Disposition de tête HTTP nom de fichier * = ... valeur) puis utilisez de URI.escape / URI .encode (son pseudonyme) aurait été correct. Les bibliothèque de base de la documentation le remplacement proposées ne sont pas fidèles dans ce cas, car ils ne sont pas équivalentes:

  • est converti en + , pas % 20
  • + est converti en % 2B , ne reste pas comme +

    Quelques commentaires sur cette suggèrent un gsub pour pirater le dos de chaîne vers l'original, mais cela est beaucoup plus simple:

    • https : //ruby-doc.org/stdlib-2.7.1/libdoc/erb/rdoc/ERB/Util.html#method-c-url_encode

      ... source de bascule pour voir comment cela fonctionne - il est juste un codeur émoussé sans contexte. C'est exactement ce que vous voulez parfois quand vous savez ce que vous faites, alors espérons qu'il ne soit pas retiré de, ou dépréciée au sein de la bibliothèque standard.

      Si je reçois le temps que je l'intention de soumettre un patch à la bibliothèque de base docs qui répertorie les trois (pas deux) alternatives possibles et donne plus d'informations lorsque vous utilisez chacun d'eux. En ce moment, il est clair du très grand nombre de Google frappe à ce sujet, et un grand nombre d'au-meilleures réponses trompeuses, que la communauté est dangereusement confus par le statu quo.


0 commentaires