2010-07-11 7 views
161

En Ruby on Rails 3 (actualmente utilizando Beta 4), veo que cuando se usan los ayudantes form_tag o form_for hay un campo oculto llamado _snowman con el valor de ☃ (Unicode \ x9731) que aparece.¿Para qué sirve el _snowman param en las formas de Ruby on Rails 3?

Entonces, ¿para qué es esto?

+1

Este es un tipo de preguntas y respuestas sobre 'documentación' - traté de encontrar una respuesta aquí y terminé revisando los mensajes de compromiso, así que pensé en compartirlo aquí para otros que se estén preguntando sobre el muñeco de nieve ... –

+0

Ver también [esto] (http://programmers.stackexchange.com/q/168751/37622). – MasterMastic

Respuesta

55

Esto está aquí para admitir Internet Explorer   y animarlo a utilizar UTF-8 para sus formularios.

El mensaje de consignación visto here detalles de la siguiente manera:

Fix varios problemas conocidos de codificación web:

  • Especificar accept-charset en todas las formas. Todos los navegadores recientes, así como IE5 +, utilizarán la codificación especificada de parámetros de forma
  • Desafortunadamente, IE5 + no mirará a aceptar-charset a menos que una carácter en los valores de la forma no es en juego de caracteres de la página. Dado que el usuario puede anular el juego de caracteres por defecto
    (que Los juegos de rieles a UTF-8), que proporcionan un campo oculto que contiene un carácter Unicode, lo que obliga a IE vistazo al juego de caracteres aceptar.
  • Ahora que la gran mayoría de la entrada web es UTF-8, establecemos los parámetros entrantes en UTF-8. Esto eliminará muchos casos de codificaciones incompatibles entre ASCII-8BIT y
    UTF-8 .
  • puede ignorar params [: _ muñeco de nieve]

En resumen, se puede ignorar este parámetro.

Aún así, no estoy seguro de por qué estamos apoyando tecnologías antiguas como Internet   Explorer 5. Parece que no es una decisión de Ruby on Rails si me preguntan.

+6

La cita dice "IE5 +", ¿entonces tal vez el problema también ocurre en versiones más nuevas de IE? – Philipp

+5

Para obtener una respuesta más larga, consulte http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076 (también, consulte mi respuesta a continuación) –

292

Este parámetro se agregó a los formularios para forzar Internet Explorer (5, 6, 7 y 8) para codificar sus parámetros como unicode.

Específicamente, este error se puede activar si el usuario cambia la codificación del navegador a Latin-1. Para entender por qué un usuario decidiría hacer algo aparentemente tan loco, echa un vistazo a this google search. Una vez que el usuario ha puesto el sitio web en modo Latin-1, si utilizan caracteres que pueden entenderse como Latin-1 y Unicode (por ejemplo, é o ç, comunes en los nombres), Internet Explorer los codificará en latín -1.

Esto significa que si un usuario busca "Ché Guevara", entrará incorrectamente en el lado del servidor. En Ruby 1.9, esto dará como resultado un error de codificación cuando el texto inevitablemente se abre paso en el motor de expresiones regulares. En Ruby 1.8, dará como resultado resultados rotos para el usuario.

Al crear un parámetro que solo puede ser entendido por IE como unicode, estamos forzando a IE a mirar el atributo accept-charset, que luego le dice que codifique todos los caracteres como UTF-8, incluso que se puede codificar en Latin-1.

Tenga en cuenta que en Ruby 1.8, es extremadamente trivial para obtener Latin-1 datos en su base de datos UTF-8 (desde nada en todo los controles de pila que los bytes que el usuario envió en cualquier punto son válidos Caracteres UTF-8). Como resultado, es extremadamente común que las aplicaciones de Ruby (y las aplicaciones de PHP, etc.) muestren este error de usuario y, por lo tanto, es muy común que los usuarios intenten cambiar la codificación como medida paliativa.

Dicho todo esto, cuando escribí este parche, no me di cuenta de que el nombre del parámetro aparecería alguna vez en un lugar de usuario (lo hace con formularios que usan la acción GET, como formularios de búsqueda) . Como lo hace, cambiaremos el nombre de este parámetro a _e y usaremos un carácter Unicode de aspecto más inofensivo.

+1

Si esto termina como un parámetro transparente como _method, probablemente será mucho menos confuso. Sin embargo, qué cosa tan loca de tener que arreglar. – tadman

+1

Gracias por la respuesta detallada Yehuda, aunque creo que mantener al muñeco de nieve es el mejor resultado, probablemente sea una de esas 'empresas' estúpidas que se lleven a cabo: '¿qué demonios es este muñeco de nieve?'? esto es un negocio, no un juego! '.. Ugh. –

+1

@Matthew, curiosamente tienes razón. Pero siento que la solución es bastante impresionante. –

Cuestiones relacionadas