A cosa serve il parametro _snowman nei moduli di Ruby on Rails 3?


174

In Ruby on Rails 3 (attualmente usando Beta 4), vedo che quando si usano gli helper form_tago form_forc'è un campo nascosto chiamato _snowmancon il valore di ☃ ( Unicode \ x9731) che appare.

Quindi, a cosa serve?


2
Domande e risposte di tipo "documentazione": ho cercato di trovare una risposta qui e ho finito per scavare tra i messaggi di commit, quindi ho pensato di condividerla qui per gli altri che si chiedono del pupazzo di neve ...
Matthew Savage,

Vedi anche questo .
MasterMastic,

Risposte:


308

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

In particolare, questo errore può essere attivato se l'utente commuta la codifica del browser su Latin-1. Per capire perché un utente dovrebbe decidere di fare qualcosa di apparentemente così folle, dai un'occhiata a questa ricerca su Google . Una volta che l'utente ha messo il sito in modalità Latin-1, se usano caratteri che possono essere compresi sia in Latin-1 che in Unicode (ad esempio, é o ç, comuni nei nomi), Internet Explorer li codificherà in latino -1.

Ciò significa che se un utente cerca "Ché Guevara", verrà visualizzato in modo errato sul lato server. In Ruby 1.9, ciò comporterà un errore di codifica quando il testo inevitabilmente si farà strada nel motore delle espressioni regolari. In Ruby 1.8, si otterranno risultati interrotti per l'utente.

Creando un parametro che può essere compreso da IE solo come carattere unicode, stiamo forzando IE a guardare l'attributo accept-charset, che poi gli dice di codificare tutti i caratteri come UTF-8, anche quelli che possono essere codificati in latino-1.

Tieni presente che in Ruby 1.8 è estremamente banale ottenere i dati Latin-1 nel tuo database UTF-8 (poiché nulla nell'intero stack controlla che i byte inviati dall'utente in qualsiasi punto siano caratteri UTF-8 validi). Di conseguenza, è estremamente comune per le applicazioni Ruby (e applicazioni PHP, ecc. Ecc.) Esibire questo bug rivolto all'utente, e quindi estremamente comune per gli utenti provare a cambiare la codifica come misura palliativa.

Detto questo, quando ho scritto questa patch, non mi rendevo conto che il nome del parametro sarebbe mai comparso in un luogo rivolto all'utente (lo fa con i moduli che usano l'azione GET, come i moduli di ricerca). Dal momento che lo faremo, rinomineremo questo parametro _ee useremo un carattere unicode dall'aspetto più innocuo.


1
Se questo finisce con un parametro trasparente come _method, probabilmente sarà molto meno confuso. Che cosa folle 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" prenderanno in considerazione - "che diavolo è questa cosa del pupazzo di neve?!? questo è un affare, non un gioco! '.. Ugh.
Matthew Savage,

1
@Matthew, stranamente hai ragione. Ma penso che la soluzione sia piuttosto impressionante.
JP Silvashy,

10
Da allora Snowman è stato sostituito da un input nascosto chiamato utf8 con valore impostato su "& # x2713". Uso un form_tag per il mio selettore di lingua e ho iniziato a ottenere molte eccezioni perché un crawler sembra avere problemi con questo valore e concatena erroneamente il parametro utf8 e il suo valore con il valore di un'opzione di selezione nel modulo.
Christer Fernstrom,

56

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

Il messaggio di commit visualizzato qui lo dettaglia come segue:

Risolvi diversi problemi di codifica Web noti:

  • Specificare accept-charset su tutti i moduli. Tutti i browser recenti, così come IE5 +, utilizzeranno la codifica specificata per i parametri del modulo
  • Sfortunatamente, IE5 + non prenderà in considerazione accetta-charset a meno che almeno un carattere nei valori del modulo non sia nel set di caratteri della pagina. Poiché l'utente può ignorare il
    set di caratteri predefinito (che Rails imposta su UTF-8), forniamo un input nascosto contenente un carattere unicode, costringendo IE a guardare il set di accettazione.
  • Ora che la maggior parte dell'input Web è UTF-8, impostiamo i parametri in entrata su UTF-8. Ciò eliminerà molti casi di codifiche incompatibili tra ASCII-8BIT e
    UTF-8.
  • Puoi tranquillamente ignorare i parametri [: _ snowman]

In breve, puoi tranquillamente ignorare questo parametro.

Tuttavia, non sono sicuro del perché stiamo supportando le vecchie tecnologie come Internet Explorer 5. Sembra una decisione molto diversa da Ruby on Rails se me lo chiedi.


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

5
Per una risposta più lunga, dai un'occhiata a github.com/rails/rails/commit/… (vedi anche la mia risposta di seguito)
Yehuda Katz,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.