2010-07-11 1 views
161

Dans Ruby on Rails 3 (actuellement en Beta 4), je vois que lorsque vous utilisez les helpers form_tag ou form_for, il y a un champ caché nommé _snowman avec la valeur de ☃ (Unicode \ x9731) apparaissant.A quoi sert le param _snowman dans Ruby on Rails 3?

Alors, à quoi sert-il?

+1

Ceci est un type de 'documentation' Q & A - J'ai essayé de trouver une réponse ici et j'ai fini par creuser les messages de validation, donc je me suis dit que je la partagerais ici pour d'autres personnes ... –

+0

[ceci] (http://programmers.stackexchange.com/q/168751/37622). – MasterMastic

Répondre

55

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

Le message de commit vu here détails comme suit:

corriger plusieurs problèmes de codage Web connus:

  • accept-charset Indiquez sur toutes les formes. Tous les navigateurs récents, ainsi que IE5 +, utilisera le codage spécifié pour les paramètres de formulaire
  • Malheureusement, IE5 + ne regarde accept-charset sauf si au moins un caractère dans les valeurs du formulaire ne dans le charset de la page. Étant donné que l'utilisateur peut remplacer la valeur par défaut
    charset (qui Rails ensembles en UTF-8), nous fournissons une entrée cachée contenant un caractère unicode, forçant IE à regard sur l'accept-charset.
  • Maintenant que la grande majorité de l'entrée Web est UTF-8, nous définissons les paramètres entrants en UTF-8. Ceci permettra d'éliminer de nombreux cas de codages incompatibles entre ASCII-8BIT et
    UTF-8.
  • Vous pouvez ignorer en toute sécurité params [: _ bonhomme de neige]

En bref, vous pouvez ignorer en toute sécurité ce paramètre. Pourtant, je ne suis pas sûr de savoir pourquoi nous soutenons les anciennes technologies comme Internet   Explorer 5. Cela me semble être une décision très non-Ruby on Rails si vous me demandez.

+6

La citation dit "IE5 +", donc peut-être le problème se produit dans les versions plus récentes d'IE, aussi? – Philipp

+5

Pour une réponse plus longue, s'il vous plaît jeter un oeil à http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076 (aussi, voir ma réponse ci-dessous) –

292

Ce paramètre a été ajouté aux formulaires afin de forcer Internet Explorer (5, 6, 7 et 8) à coder ses paramètres en tant qu'unicode. En particulier, ce bug peut être déclenché si l'utilisateur passe l'encodage du navigateur à Latin-1. Pour comprendre pourquoi un utilisateur décide de faire quelque chose qui semble si fou, consultez this google search. Une fois que l'utilisateur a mis le site web en mode Latin-1, s'il utilise des caractères qui peuvent être compris comme Latin-1 et Unicode (par exemple, é ou ç, commun dans les noms), Internet Explorer les encodera en latin -1. Cela signifie que si un utilisateur recherche "Ché Guevara", il ne le recevra pas correctement côté serveur. Dans Ruby 1.9, cela entraînera une erreur d'encodage lorsque le texte se retrouvera inévitablement dans le moteur d'expressions régulières. Dans Ruby 1.8, cela entraînera des résultats brisés pour l'utilisateur.En créant un paramètre qui ne peut être compris que par IE comme unicode, nous forçons IE à regarder l'attribut accept-charset, qui lui dit de coder tous les caractères comme UTF-8, même ceux qui peut être encodé en Latin-1.

Gardez à l'esprit que Ruby 1.8, il est extrêmement trivial pour obtenir des données Latin-1 dans votre base de données UTF-8 (depuis rien dans les contrôles entiers de pile que les octets que l'utilisateur envoyé à tout moment sont valables Caractères UTF-8). Par conséquent, 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 commun pour les utilisateurs d'essayer de changer l'encodage en tant que mesure palliative. Cela dit, quand j'ai écrit ce correctif, je ne me suis pas rendu compte que le nom du paramètre apparaîtrait jamais dans un endroit en face de l'utilisateur (avec des formes qui utilisent l'action GET, comme les formulaires de recherche) . Comme c'est le cas, nous allons renommer ce paramètre à _e, et utiliser un caractère unicode plus inoffensif.

+1

Si cela se termine 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 - bien que je pense que garder le bonhomme de neige est le meilleur résultat, c'est probablement une de ces choses stupides que 'les entreprises' vont choisir - 'Qu'est-ce que c'est que ce bonhomme de neige?!? c'est une affaire, pas un jeu! '.. Ugh. –

+1

@Matthew, curieusement, vous avez raison. Mais je pense que la solution est assez impressionnante. –