¿Para qué sirve el parámetro _snowman en Ruby on Rails 3?

174

En Ruby on Rails 3 (actualmente usando Beta 4), veo que cuando uso los form_tago form_forhelpers hay un campo oculto llamado _snowmancon el valor de ☃ ( Unicode \ x9731).

Entonces, ¿para qué sirve esto?

Peter Mortensen
fuente
2
Esta es una pregunta y tipo de 'documentación': traté de encontrar una respuesta aquí y terminé investigando los mensajes de confirmación, así que pensé en compartirla aquí para otros que se preguntan sobre el muñeco de nieve ...
Matthew Savage
También mira esto .
MasterMastic

Respuestas:

308

Este parámetro se agregó a los formularios para obligar a Internet Explorer (5, 6, 7 y 8) a 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 comprender por qué un usuario decidiría hacer algo aparentemente tan loco, consulte esta búsqueda de Google . Una vez que el usuario ha puesto el sitio web en modo Latin-1, si utiliza caracteres que se pueden entender 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", aparecerá incorrectamente en el lado del servidor. En Ruby 1.9, esto dará como resultado un error de codificación cuando el texto inevitablemente llegue al motor de expresiones regulares. En Ruby 1.8, dará como resultado resultados rotos para el usuario.

Al crear un parámetro que solo IE puede entender como un carácter unicode, estamos obligando a IE a mirar el atributo accept-charset, que luego le dice que codifique todos los caracteres como UTF-8, incluso los que pueden codificarse en latín-1.

Tenga en cuenta que en Ruby 1.8, es extremadamente trivial obtener datos Latin-1 en su base de datos UTF-8 (ya que nada en la pila completa verifica que los bytes que el usuario envió en cualquier momento sean caracteres UTF-8 válidos). Como resultado, es extremadamente común que las aplicaciones de Ruby (y aplicaciones PHP, etc., etc.) exhiban este error orientado al usuario y, por lo tanto, es extremadamente 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 orientado al usuario (lo hace con formularios que usan la acción GET, como los formularios de búsqueda). Como lo hace, cambiaremos el nombre de este parámetro _ey usaremos un carácter unicode de aspecto más inocuo.

Yehuda Katz
fuente
1
Si esto termina siendo un parámetro transparente como _method, probablemente será mucho menos confuso. Sin embargo, es una locura tener que arreglarlo.
tadman
1
Gracias por la respuesta detallada Yehuda, aunque creo que quedarse con el muñeco de nieve es el mejor resultado, probablemente sea una de esas cosas estúpidas que las 'empresas' tomarán en cuenta: '¡¿Qué demonios es esta cosa del muñeco de nieve ?! ¡Esto es un negocio, no un juego! '... Ugh.
Matthew Savage
1
@Matthew, curiosamente tienes razón. Pero sí siento que la solución es bastante impresionante.
JP Silvashy
10
Desde entonces, Snowman ha sido reemplazado por una entrada oculta llamada utf8 con el valor establecido en "& # x2713". Utilizo un form_tag para mi selector de idiomas y comencé a obtener muchas excepciones porque un rastreador parece tener problemas con este valor y concatena incorrectamente el parámetro utf8 y su valor con el valor de una opción de selección en el formulario.
Christer Fernstrom
56

Esto está aquí para admitir Internet Explorer 5 y alentarlo a usar UTF-8 para sus formularios.

El mensaje de confirmación visto aquí lo detalla de la siguiente manera:

Solucione varios problemas de codificación web conocidos:

  • Especifique accept-charset en todos los formularios. Todos los navegadores recientes, así como IE5 +, utilizarán la codificación especificada para los parámetros del formulario.
  • Desafortunadamente, IE5 + no verá el conjunto de caracteres de aceptación a menos que al menos un carácter en los valores del formulario no esté en el conjunto de caracteres de la página. Dado que el usuario puede anular el
    juego de caracteres predeterminado (que Rails establece en UTF-8), proporcionamos una entrada oculta que contiene un carácter unicode, lo que obliga a IE a mirar el juego de caracteres de aceptación.
  • Ahora que la gran mayoría de la entrada web es UTF-8, establecemos los parámetros de entrada en UTF-8. Esto eliminará muchos casos de codificaciones incompatibles entre ASCII-8BIT y
    UTF-8.
  • Puede ignorar con seguridad los parámetros [: _ muñeco de nieve]

En resumen, puede ignorar este parámetro de forma segura.

Aún así, no estoy seguro de por qué admitimos tecnologías antiguas como Internet Explorer 5. Parece que es una decisión muy diferente a Ruby on Rails si me preguntas.

Matthew Savage
fuente
77
La cita dice "IE5 +", ¿entonces quizás el problema también ocurra en las versiones más nuevas de IE?
Philipp
55
Para obtener una respuesta más larga, eche un vistazo a github.com/rails/rails/commit/… (también, vea mi respuesta a continuación)
Yehuda Katz