174 votes

À quoi sert le paramètre _snowman dans les formulaires Ruby on Rails 3 ?

Dans Ruby on Rails 3 (j'utilise actuellement la Beta 4), je constate que lorsque l'on utilise la fonction form_tag o form_for il y a un champ caché nommé _snowman avec la valeur de ☃ ( Unicode \x9731 ) qui apparaissent.

Alors, à quoi ça sert ?

306voto

Yehuda Katz Points 18277

Ce paramètre a été ajouté aux formulaires afin de forcer Internet Explorer (5, 6, 7 y 8) pour coder ses paramètres en unicode.

Plus précisément, ce bogue peut être déclenché si l'utilisateur règle l'encodage du navigateur sur Latin-1. Pour comprendre pourquoi un utilisateur déciderait de faire quelque chose d'apparemment si fou, regardez cette recherche google . Une fois que l'utilisateur a mis le site web en mode Latin-1, s'il utilise des caractères qui peuvent être compris à la fois comme Latin-1 et Unicode (par exemple, é ou ç, courants dans les noms), Internet Explorer les codera en Latin-1.

Cela signifie que si un utilisateur recherche "Ché Guevara", le résultat sera incorrect du côté du serveur. En Ruby 1.9, cela se traduira par une erreur d'encodage lorsque le texte se retrouvera inévitablement dans le moteur d'expression régulière. En Ruby 1.8, cela se traduira par des résultats erronés pour l'utilisateur.

En créant un paramètre qui ne peut être compris par IE que comme un caractère unicode, nous obligeons IE à consulter l'attribut accept-charset, qui lui indique alors de coder tous les caractères en UTF-8, même ceux qui peuvent être codés en Latin-1.

Gardez à l'esprit que dans Ruby 1.8, il est extrêmement trivial d'obtenir des données en Latin-1 dans votre base de données UTF-8 (puisque rien dans toute la pile vérifie que les octets que l'utilisateur a envoyés à un moment donné sont des caractères UTF-8 valides). Par conséquent, il est extrêmement courant que les applications Ruby (et les applications PHP, etc. etc.) présentent ce bogue côté utilisateur, et donc extrêmement courant que les utilisateurs essaient de changer l'encodage comme mesure palliative.

Cela dit, lorsque j'ai écrit ce correctif, je n'avais pas réalisé que le nom du paramètre apparaîtrait un jour à un endroit où l'utilisateur est en contact avec le système (c'est le cas avec les formulaires qui utilisent l'action GET, comme les formulaires de recherche). Puisque c'est le cas, nous allons renommer ce paramètre en _e et utiliser un caractère unicode plus inoffensif.

55voto

Matthew Savage Points 1559

Ceci est là pour soutenir Internet Explorer 5 et l'encourager à utiliser UTF-8 pour ses formes.

Le message de validation vu aquí le détaille comme suit :

Correction de plusieurs problèmes connus d'encodage web :

  • Spécifiez accept-charset sur tous les formulaires. Tous les navigateurs récents, ainsi que IE5+, utiliseront l'encodage spécifié pour les paramètres du formulaire
  • Malheureusement, IE5+ ne regardera pas accept-charset à moins qu'au moins un caractère dans les valeurs du formulaire n'est pas dans le jeu de caractères de la page. Puisque l'utilisateur utilisateur peut remplacer la valeur par défaut
    (que Rails définit comme UTF-8), nous fournissons une entrée cachée contenant un caractère unicode, ce qui oblige IE à à regarder l'accept-charset.
  • Maintenant que la grande majorité des entrées web sont en UTF-8, nous définissons les paramètres entrants à UTF-8. Cela va éliminera de nombreux cas d'incompatibilité d'encodages incompatibles entre l'ASCII-8BIT et le
    UTF-8.
  • Vous pouvez sans risque ignorer les params[:_snowman]

En bref, vous pouvez ignorer ce paramètre sans risque.

Pourtant, je ne sais pas pourquoi nous soutenons des technologies anciennes comme Internet Explorer 5. C'est une décision qui ne ressemble pas du tout à Ruby on Rails, si vous voulez mon avis.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X