Untuk apa bentuk _snowman param di Ruby on Rails 3?

174

Di Ruby on Rails 3 (saat ini menggunakan Beta 4), saya melihat bahwa ketika menggunakan form_tagatau form_forpembantu ada bidang tersembunyi bernama _snowmandengan nilai ☃ ( Unicode \ x9731) muncul.

Jadi, untuk apa ini?

Peter Mortensen
sumber
2
Ini adalah jenis 'dokumentasi' tanya jawab - Saya mencoba menemukan jawaban di sini dan akhirnya menggali pesan komit jadi saya pikir saya akan membagikannya di sini untuk orang lain yang bertanya-tanya tentang manusia salju ...
Matthew Savage
Lihat juga ini .
MasterMastic

Jawaban:

308

Parameter ini ditambahkan ke formulir untuk memaksa Internet Explorer (5, 6, 7 dan 8) untuk menyandikan parameternya sebagai unicode.

Secara khusus, bug ini dapat dipicu jika pengguna mengalihkan pengodean browser ke Latin-1. Untuk memahami mengapa pengguna memutuskan untuk melakukan sesuatu yang tampaknya sangat gila, lihat pencarian google ini . Setelah pengguna menempatkan situs web ke mode Latin-1, jika mereka menggunakan karakter yang dapat dipahami sebagai Latin-1 dan Unicode (misalnya, é atau ç, umum dalam nama), Internet Explorer akan menyandikannya dalam bahasa Latin -1.

Ini berarti bahwa jika pengguna mencari "Ché Guevara", itu akan terjadi secara tidak benar di sisi server. Di Ruby 1.9, ini akan menghasilkan kesalahan pengodean ketika teks mau tidak mau masuk ke mesin ekspresi reguler. Di Ruby 1.8, itu akan menghasilkan hasil yang rusak bagi pengguna.

Dengan membuat parameter yang hanya dapat dipahami oleh IE sebagai karakter unicode, kami memaksa IE untuk melihat atribut accept-charset, yang kemudian memerintahkannya untuk menyandikan semua karakter sebagai UTF-8, bahkan yang dapat dikodekan. dalam bahasa Latin-1.

Ingatlah bahwa di Ruby 1.8, sangat sepele untuk memasukkan data Latin-1 ke dalam basis data UTF-8 Anda (karena tidak ada dalam seluruh tumpukan yang memeriksa bahwa byte yang dikirim pengguna pada titik mana pun adalah karakter UTF-8 yang valid). Akibatnya, sangat umum untuk aplikasi Ruby (dan aplikasi PHP, dll.) Untuk menunjukkan bug yang dihadapi pengguna ini, dan karenanya sangat umum bagi pengguna untuk mencoba mengubah pengodean sebagai ukuran paliatif.

Semua yang mengatakan, ketika saya menulis tambalan ini, saya tidak menyadari bahwa nama parameter akan pernah muncul di tempat yang menghadap pengguna (tidak dengan formulir yang menggunakan tindakan GET, seperti formulir pencarian). Karena hal itu terjadi, kita akan mengganti nama parameter ini menjadi _e, dan menggunakan karakter unicode yang lebih tidak berbahaya.

Yehuda Katz
sumber
1
Jika ini menghasilkan parameter transparan seperti _method, itu mungkin akan jauh lebih membingungkan. Betapa gila hal yang harus diperbaiki.
tadman
1
Terima kasih atas tanggapan terperinci Yehuda - meskipun saya pikir menjaga manusia salju adalah hasil terbaik yang mungkin salah satu dari hal-hal bodoh yang 'dipilih' oleh perusahaan - 'apa benda salju ini?!? ini bisnis, bukan permainan! '.. Ugh.
Matthew Savage
1
@ Matius, anehnya kamu benar. Tapi saya merasa solusinya cukup mengesankan.
JP Silvashy
10
Snowman sejak itu telah digantikan oleh input tersembunyi bernama utf8 dengan nilai diatur ke "& # x2713". Saya menggunakan form_tag untuk pengalih bahasa saya dan mulai mendapatkan banyak pengecualian karena satu perayap tampaknya memiliki masalah dengan nilai ini dan salah menggabungkan parameter utf8 dan nilainya dengan nilai opsi pilihan dalam formulir.
Christer Fernstrom
56

Ini di sini untuk mendukung Internet Explorer 5 dan mendorongnya untuk menggunakan UTF-8 untuk bentuknya.

Pesan komit yang terlihat di sini menjelaskannya sebagai berikut:

Perbaiki beberapa masalah penyandian web yang diketahui:

  • Tentukan rangkaian terima-terima pada semua formulir. Semua browser terbaru, serta IE5 +, akan menggunakan pengodean yang ditentukan untuk parameter formulir
  • Sayangnya, IE5 + tidak akan melihat accept-charset kecuali jika setidaknya satu karakter dalam nilai form tidak ada di charset halaman. Karena pengguna dapat mengganti
    charset default (yang ditetapkan Rails ke UTF-8), kami memberikan input tersembunyi yang mengandung karakter unicode, memaksa IE untuk melihat charset accept-.
  • Sekarang sebagian besar input web adalah UTF-8, kami menetapkan parameter masuk ke UTF-8. Ini akan menghilangkan banyak kasus pengkodean yang tidak kompatibel antara ASCII-8BIT dan
    UTF-8.
  • Anda dapat dengan aman mengabaikan params [: _ snowman]

Singkatnya, Anda dapat dengan aman mengabaikan parameter ini.

Namun, saya tidak yakin mengapa kami mendukung teknologi lama seperti Internet Explorer 5. Sepertinya ini keputusan yang sangat non-Ruby on Rails jika Anda bertanya kepada saya.

Matthew Savage
sumber
7
Kutipan mengatakan "IE5 +", jadi mungkin masalah terjadi di versi IE yang lebih baru juga?
Philipp
5
Untuk tanggapan yang lebih panjang, silakan lihat github.com/rails/rails/commit/… (juga, lihat tanggapan saya di bawah ini)
Yehuda Katz