Para que servem os parâmetros _snowman nos formulários Ruby on Rails 3?

174

No Ruby on Rails 3 (atualmente usando o Beta 4), vejo que ao usar o form_tagou form_forhelpers, existe um campo oculto nomeado _snowmancom o valor de ☃ ( Unicode \ x9731) aparecendo.

Então, para que serve isso?

Peter Mortensen
fonte
2
Esta é uma perguntas e respostas do tipo 'documentação' - tentei encontrar uma resposta aqui e acabei pesquisando as mensagens de confirmação, então achei que a compartilharia aqui para outras pessoas que estão se perguntando sobre o boneco de neve ...
Matthew Savage
Veja também isso .
MasterMastic

Respostas:

308

Este parâmetro foi adicionado aos formulários para forçar o Internet Explorer (5, 6, 7 e 8) a codificar seus parâmetros como unicode.

Especificamente, esse bug pode ser acionado se o usuário alternar a codificação do navegador para Latin-1. Para entender por que um usuário decidiria fazer algo aparentemente tão louco, confira esta pesquisa no Google . Depois que o usuário colocar o site no modo Latin-1, se eles usarem caracteres que possam ser entendidos como Latin-1 e Unicode (por exemplo, é ou ç, comuns em nomes), o Internet Explorer os codificará em latim. -1.

Isso significa que, se um usuário pesquisar "Ché Guevara", ele será exibido incorretamente no servidor. No Ruby 1.9, isso resultará em um erro de codificação quando o texto inevitavelmente entrar no mecanismo de expressão regular. No Ruby 1.8, resultará em resultados quebrados para o usuário.

Ao criar um parâmetro que só pode ser entendido pelo IE como um caractere unicode, estamos forçando o IE a olhar para o atributo accept-charset, que então o instrui a codificar todos os caracteres como UTF-8, mesmo aqueles que podem ser codificados em latim-1.

Lembre-se de que, no Ruby 1.8, é extremamente trivial obter dados do Latin-1 no banco de dados UTF-8 (já que nada na pilha inteira verifica se os bytes que o usuário enviou a qualquer momento são caracteres UTF-8 válidos). Como resultado, é extremamente comum que aplicativos Ruby (e aplicativos PHP, etc.) exibam esse bug voltado para o usuário e, portanto, extremamente comum que os usuários tentem alterar a codificação como uma medida paliativa.

Tudo o que foi dito, quando escrevi esse patch, não percebi que o nome do parâmetro jamais apareceria em um local voltado para o usuário (isso ocorre com formulários que usam a ação GET, como os formulários de pesquisa). Como isso acontece, renomearemos esse parâmetro para _ee usaremos um caractere unicode de aparência mais inócua.

Yehuda Katz
fonte
1
Se isso acabar com um parâmetro transparente como _method, provavelmente será muito menos confuso. Mas que coisa louca de consertar.
23410 tadman
1
Obrigado pela resposta detalhada Yehuda - embora eu ache que manter o boneco de neve seja o melhor resultado, provavelmente uma dessas coisas estúpidas que as 'empresas' escolherão - 'que diabos é essa coisa de boneco de neve?!? isso é um negócio, não um jogo! '.. Ugh.
Matthew Savage
1
@ Matthew, por incrível que pareça, você está certo. Mas sinto que a solução é bastante impressionante.
JP Silvashy 25/08/10
10
O Snowman foi substituído por uma entrada oculta denominada utf8 com o valor definido como "& # x2713". Eu uso um form_tag para meu alternador de idiomas e comecei a receber muitas exceções porque um rastreador parece ter problemas com esse valor e concatena incorretamente o parâmetro utf8 e seu valor com o valor de uma opção de seleção no formulário.
Christer Fernstrom
56

Aqui está para oferecer suporte ao Internet Explorer 5 e incentivá-lo a usar UTF-8 para seus formulários.

A mensagem de confirmação vista aqui detalha da seguinte maneira:

Corrija vários problemas conhecidos de codificação da web:

  • Especifique accept-charset em todos os formulários. Todos os navegadores recentes, assim como o IE5 +, usarão a codificação especificada para os parâmetros do formulário
  • Infelizmente, o IE5 + não examinará o accept-charset, a menos que pelo menos um caractere nos valores do formulário não esteja no charset da página. Como o usuário pode substituir o conjunto de
    caracteres padrão (que o Rails define como UTF-8), fornecemos uma entrada oculta contendo um caractere unicode, forçando o IE a examinar o conjunto de caracteres aceito.
  • Agora que a grande maioria das entradas da Web é UTF-8, definimos os parâmetros de entrada como UTF-8. Isso eliminará muitos casos de codificações incompatíveis entre ASCII-8BIT e
    UTF-8.
  • Você pode ignorar com segurança os parâmetros [: _ boneco de neve]

Em resumo, você pode ignorar com segurança esse parâmetro.

Ainda assim, não sei por que estamos dando suporte a tecnologias antigas como o Internet Explorer 5. Parece uma decisão muito diferente do Ruby on Rails, se você me perguntar.

Matthew Savage
fonte
7
A citação diz "IE5 +", então talvez o problema ocorra também nas versões mais recentes do IE?
Philipp
5
Para uma resposta mais longa, por favor dê uma olhada github.com/rails/rails/commit/... (também, ver a minha resposta abaixo)
Yehuda Katz