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

174

Dans Ruby on Rails 3 (qui utilise actuellement la version bêta 4), je vois que lorsque vous utilisez les helpers form_tagou, form_foril y a un champ caché nommé _snowmanavec la valeur de ☃ ( Unicode \ x9731) qui apparaît.

Alors, à quoi ça sert?

Peter Mortensen
la source
2
C'est une question-réponse de type `` documentation '' - J'ai essayé de trouver une réponse ici et j'ai fini par fouiller dans les messages de validation, alors j'ai pensé que je la partagerais ici pour d'autres qui s'interrogent sur le bonhomme de neige ...
Matthew Savage
Regardez aussi ceci .
MasterMastic

Réponses:

308

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

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

Cela signifie que si un utilisateur recherche "Ché Guevara", il arrivera de manière incorrecte côté serveur. Dans Ruby 1.9, cela entraînera une erreur de codage lorsque le texte pénètre inévitablement dans le moteur d'expressions régulières. Dans Ruby 1.8, cela entraînera des résultats cassés pour l'utilisateur.

En créant un paramètre qui ne peut être compris par IE que comme un caractère unicode, nous forçons IE à regarder l'attribut accept-charset, qui lui dit ensuite d'encoder tous les caractères en UTF-8, même ceux qui peuvent être encodés en latin-1.

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

Cela dit, lorsque j'ai écrit ce patch, je ne savais pas que le nom du paramètre apparaîtrait un jour dans un endroit face à l'utilisateur (c'est le cas avec les formulaires qui utilisent l'action GET, tels que les formulaires de recherche). Comme c'est le cas, nous renommerons ce paramètre en _eet utiliserons un caractère unicode plus inoffensif.

Yehuda Katz
la source
1
Si cela aboutit à un paramètre transparent comme _method, ce sera probablement beaucoup moins déroutant. Quelle chose folle à réparer, cependant.
tadman
1
Merci pour la réponse détaillée Yehuda - même si je pense que garder le bonhomme de neige est le meilleur résultat, c'est probablement l'une de ces choses stupides que les `` entreprises '' choisiront - `` Qu'est-ce que c'est que ce truc de bonhomme de neige?!? c'est une affaire, pas un jeu! ».. Ugh.
Matthew Savage
1
@Matthew, curieusement, vous avez raison. Mais j'ai l'impression que la solution est assez impressionnante.
JP Silvashy
10
Snowman a depuis été remplacé par une entrée cachée nommée utf8 avec une valeur définie sur "& # x2713". J'utilise un form_tag pour mon sélecteur de langue et j'ai commencé à obtenir de nombreuses exceptions car un robot semble avoir des problèmes avec cette valeur et concatène de manière incorrecte le paramètre utf8 et sa valeur avec la valeur d'une option de sélection dans le formulaire.
Christer Fernstrom
56

Ceci est là pour prendre en charge Internet Explorer 5 et l'encourager à utiliser UTF-8 pour ses formulaires.

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

Résolvez plusieurs problèmes d'encodage Web connus:

  • 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 de formulaire
  • Malheureusement, IE5 + ne regardera pas accept-charset à moins qu'au moins un caractère des valeurs du formulaire ne soit pas dans le jeu de caractères de la page. Comme l'utilisateur peut remplacer le
    jeu de caractères par défaut (que Rails définit sur UTF-8), nous fournissons une entrée masquée contenant un caractère unicode, forçant IE à regarder le jeu de caractères accept.
  • Maintenant que la grande majorité des entrées Web est UTF-8, nous définissons les paramètres entrants sur UTF-8. Cela éliminera de nombreux cas d'encodages incompatibles entre ASCII-8BIT et
    UTF-8.
  • Vous pouvez ignorer en toute sécurité les paramètres [: _ snowman]

En bref, vous pouvez ignorer ce paramètre en toute sécurité.

Pourtant, je ne sais pas pourquoi nous prenons en charge les anciennes technologies comme Internet Explorer 5. Cela semble être une décision très non Ruby on Rails si vous me demandez.

Matthew Savage
la source
7
La citation dit «IE5 +», alors peut-être que le problème se produit également dans les nouvelles versions d'IE?
Philipp
5
Pour une réponse plus longue, veuillez consulter github.com/rails/rails/commit/… (également, voir ma réponse ci-dessous)
Yehuda Katz