Do czego służy parametr _snowman w formularzach Ruby on Rails 3?

174

W Ruby on Rails 3 (obecnie używającym Beta 4) widzę, że podczas używania pomocników form_taglub form_forpojawia się ukryte pole o nazwie _snowman☃ ( Unicode \ x9731).

Więc po co to jest?

Peter Mortensen
źródło
2
To jest pytanie i odpowiedzi typu „dokumentacja” - próbowałem znaleźć odpowiedź tutaj, ale skończyło się na przekopywaniu się przez komunikaty o zmianach, więc pomyślałem, że podzielę się nimi tutaj dla innych, którzy zastanawiają się nad bałwanem ...
Matthew Savage,
Zobacz także to .
MasterMastic

Odpowiedzi:

308

Ten parametr został dodany do formularzy, aby wymusić na Internet Explorerze (5, 6, 7 i 8) kodowanie swoich parametrów jako Unicode.

W szczególności ten błąd może zostać wywołany, jeśli użytkownik zmieni kodowanie przeglądarki na Latin-1. Aby zrozumieć, dlaczego użytkownik zdecydowałby się zrobić coś pozornie tak szalonego, sprawdź tę wyszukiwarkę Google . Gdy użytkownik przełączy witrynę w tryb Latin-1, jeśli użyje znaków, które mogą być rozumiane zarówno jako Latin-1, jak i Unicode (na przykład é lub ç, powszechne w nazwach), Internet Explorer zakoduje je w alfabecie łacińskim -1.

Oznacza to, że jeśli użytkownik wyszukuje hasło „Ché Guevara”, zostanie to nieprawidłowo przesłane po stronie serwera. W Ruby 1.9 spowoduje to błąd kodowania, gdy tekst nieuchronnie trafi do silnika wyrażeń regularnych. W Ruby 1.8 spowoduje to nieprawidłowe wyniki dla użytkownika.

Tworząc parametr, który może być rozumiany tylko przez IE jako znak Unicode, zmuszamy IE do patrzenia na atrybut accept-charset, który następnie mówi mu, aby zakodował wszystkie znaki jako UTF-8, nawet te, które można zakodować w języku łacińskim-1.

Należy pamiętać, że w Ruby 1.8 bardzo trywialne jest umieszczenie danych Latin-1 w bazie danych UTF-8 (ponieważ nic w całym stosie nie sprawdza, czy bajty wysłane przez użytkownika w dowolnym momencie są poprawnymi znakami UTF-8). W rezultacie bardzo często zdarza się, że aplikacje Ruby (i aplikacje PHP itp.) Wykazują ten błąd dotyczący użytkownika, a zatem niezwykle często użytkownicy próbują zmienić kodowanie jako środek paliatywny.

Wszystko to powiedziawszy, kiedy pisałem tę łatkę, nie zdawałem sobie sprawy, że nazwa parametru kiedykolwiek pojawi się w miejscu widocznym dla użytkownika (ma to miejsce w przypadku formularzy korzystających z akcji GET, takich jak formularze wyszukiwania). Ponieważ tak jest, zmienimy nazwę tego parametru na _ei użyjemy bardziej nieszkodliwie wyglądającego znaku Unicode.

Yehuda Katz
źródło
1
Jeśli skończy się na przezroczystym parametrze, takim jak _method, prawdopodobnie będzie o wiele mniej zagmatwany. Ale co za szalona rzecz do naprawienia.
tadman
1
Dziękuję za szczegółową odpowiedź, Yehuda - chociaż myślę, że zatrzymanie bałwana to najlepszy wynik, to prawdopodobnie jedna z tych głupich rzeczy, do których `` przedsiębiorstwa '' się przyczepią - `` co to do cholery jest z tym bałwanem?!? to jest biznes, a nie gra! ”.. Ugh.
Matthew Savage
1
@Matthew, co dziwne, masz rację. Ale wydaje mi się, że rozwiązanie jest imponujące.
JP Silvashy
10
Snowman został od tego czasu zastąpiony ukrytym wejściem o nazwie utf8 z wartością ustawioną na „& # x2713”. Używam form_tag dla mojego przełącznika języków i zacząłem otrzymywać wiele wyjątków, ponieważ wydaje się, że jeden z robotów ma problemy z tą wartością i nieprawidłowo łączy parametr utf8 i jego wartość z wartością opcji wyboru w formularzu.
Christer Fernstrom
56

To jest tutaj, aby wspierać Internet Explorera 5 i zachęcić go do używania UTF-8 w swoich formularzach.

Komunikat dotyczący zatwierdzenia widoczny tutaj szczegółowo opisuje to w następujący sposób:

Napraw kilka znanych problemów z kodowaniem stron internetowych:

  • Określ zestaw znaków akceptacji we wszystkich formularzach. Wszystkie najnowsze przeglądarki, a także IE5 +, będą używać kodowania określonego dla parametrów formularza
  • Niestety, IE5 + nie będzie patrzeć na accept-charset, chyba że przynajmniej jeden znak z wartości formularza nie znajduje się w zestawie znaków strony. Ponieważ użytkownik może nadpisać domyślny
    zestaw znaków (który Railsy ustawiają na UTF-8), udostępniamy ukryte dane wejściowe zawierające znak Unicode, zmuszając IE do spojrzenia na accept-charset.
  • Teraz, gdy zdecydowana większość danych wejściowych sieci Web to UTF-8, ustawiliśmy parametry przychodzące na UTF-8. Pozwoli to wyeliminować wiele przypadków niezgodnego kodowania między ASCII-8BIT i
    UTF-8.
  • Możesz bezpiecznie zignorować parametry [: _ snowman]

Krótko mówiąc, możesz bezpiecznie zignorować ten parametr.

Mimo to nie jestem pewien, dlaczego wspieramy stare technologie, takie jak Internet Explorer 5. Wydaje mi się, że to decyzja zupełnie niezwiązana z Ruby on Rails.

Matthew Savage
źródło
7
Cytat mówi „IE5 +”, więc może problem występuje też w nowszych wersjach IE?
Philipp,
5
Aby uzyskać dłuższą odpowiedź, zajrzyj na stronę github.com/rails/rails/commit/… (także, zobacz moją odpowiedź poniżej)
Yehuda Katz