2010-07-11 8 views
161

In Ruby on Rails 3 (attualmente in uso su Beta 4), vedo che quando si utilizzano gli helper form_tag o form_for è presente un campo nascosto denominato _snowman con il valore di ☃ (Unicode \ x9731) visualizzato.Qual è il parametro _snowman nei moduli Ruby on Rails 3?

Quindi, a cosa serve?

+1

Questo è un tipo di documentazione 'Domande e risposte - Ho cercato di trovare una risposta qui e ho finito per scavare attraverso i messaggi di commit quindi ho pensato di condividerlo per altri che si stanno chiedendo il pupazzo di neve ... –

+0

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

risposta

55

Questo è qui per supportare Internet   Explorer 5 e incoraggiarlo a utilizzare UTF-8 per i suoi moduli.

Il messaggio di commit visto here dettagli come segue:

correggere diversi problemi noti di codifica web:

  • Specificare accept-charset su tutte le forme. Tutti i browser più recenti, così come IE5 +, utilizzeranno la codifica specificata per i parametri di forma
  • Purtroppo, IE5 + non guardare accept-charset a meno che almeno un carattere nei valori del form non è nel charset della pagina. Dal momento che l'utente può sovrascrivere il set di caratteri di default
    (che Rails set a UTF-8), forniamo un ingresso nascosto contenente un carattere Unicode, costringendo IE per sguardo al charset accetta-.
  • Ora che la maggior parte degli input Web è UTF-8, impostiamo i parametri in entrata su UTF-8. Ciò risolverà eliminando molti casi di codifiche incompatibili tra ASCII-8BIT e
    UTF-8.
  • È possibile ignorare params [: _ pupazzo]

In breve, è possibile ignorare questo parametro.

Ancora, non sono sicuro del motivo per cui stiamo supportando vecchie tecnologie come Internet   Explorer 5. Sembra che tu mi chieda una decisione molto non-Ruby on Rails.

+6

La citazione dice "IE5 +", quindi forse il problema si verifica anche nelle nuove versioni di IE? – Philipp

+5

Per una risposta più lunga, si prega di dare un'occhiata a http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076 (vedere anche la mia risposta di seguito) –

292

Questo parametro è stato aggiunto ai moduli per forzare Internet Explorer (5, 6, 7 e 8) per codificare i suoi parametri come unicode.

In particolare, questo errore può essere attivato se l'utente passa la codifica del browser su Latin-1. Per capire perché un utente decida di fare qualcosa di apparentemente così pazzo, dai un'occhiata a this google search. Una volta che l'utente ha inserito il sito Web in modalità Latin-1, se utilizza caratteri che possono essere compresi sia Latin-1 che Unicode (ad esempio, é o ç, comune nei nomi), Internet Explorer li codificherà in latino -1.

Ciò significa che se un utente cerca "Ché Guevara", verrà erroneamente visualizzato sul lato server. In Ruby 1.9, questo si tradurrà in un errore di codifica quando il testo entra inevitabilmente nel motore delle espressioni regolari. In Ruby 1.8, si otterranno risultati non funzionanti per l'utente.

Creando un parametro che può essere compreso solo da IE come carattere unicode, stiamo costringendo IE a esaminare l'attributo accept-charset, che quindi dice di codificare tutti i caratteri come UTF-8, anche quelli che può essere codificato in Latin-1.

Tenete a mente che in Ruby 1.8, è estremamente banale per ottenere Latin-1 i dati nel database UTF-8 (dal nulla in tutta controlli pila che i byte che l'utente ha inviato in qualsiasi punto sono validi Caratteri UTF-8). Di conseguenza, è estremamente comune per le applicazioni di Ruby (e applicazioni PHP, ecc. Ecc.) Mostrare questo bug rivolto all'utente, e quindi estremamente comune per gli utenti provare a modificare la codifica come misura palliativa.

Detto questo, quando ho scritto questa patch, non mi sono reso conto che il nome del parametro sarebbe mai apparso in un posto rivolto all'utente (lo fa con i moduli che utilizzano l'azione GET, come i moduli di ricerca) . Dato che lo fa, rinomineremo questo parametro a _e e useremo un carattere unicode dall'aspetto innocuo.

+1

Se questo finisce con un parametro trasparente come _method, probabilmente sarà molto meno confuso. Che cosa pazzesca da risolvere, però. – tadman

+1

Grazie per la risposta dettagliata Yehuda - anche se penso che mantenere il pupazzo di neve sia il miglior risultato, probabilmente una di quelle stupide cose che le "imprese" sceglieranno - "che diavolo è questa cosa da pupazzo di neve?!? questo è un business, non un gioco! '.. Ugh. –

+1

@ Matthew, stranamente hai ragione. Ma mi sento come se la soluzione fosse piuttosto impressionante. –