Thông số _snowman trong Ruby on Rails 3 là gì?


174

Trong Ruby on Rails 3 (hiện đang sử dụng Beta 4), tôi thấy rằng khi sử dụng form_taghoặc form_forngười trợ giúp, có một trường ẩn có tên _snowmangiá trị ☃ ( Unicode \ x9731) hiển thị.

Vì vậy, cái này để làm gì?


2
Đây là kiểu hỏi đáp 'tài liệu' - Tôi đã cố gắng tìm câu trả lời ở đây và cuối cùng tìm hiểu thông điệp cam kết nên tôi nghĩ rằng tôi sẽ chia sẻ nó ở đây cho những người khác đang thắc mắc về người tuyết ...
Matthew Savage

Cũng thấy điều này .
MasterMastic

Câu trả lời:


308

Tham số này đã được thêm vào biểu mẫu để buộc Internet Explorer (5, 6, 7 8) mã hóa các tham số của nó dưới dạng unicode.

Cụ thể, lỗi này có thể được kích hoạt nếu người dùng chuyển mã hóa của trình duyệt sang Latin-1. Để hiểu lý do tại sao một người dùng sẽ quyết định làm một cái gì đó dường như rất điên rồ, hãy xem tìm kiếm google này . Khi người dùng đã đặt trang web vào chế độ Latin-1, nếu họ sử dụng các ký tự có thể hiểu là cả Latin-1 và Unicode (ví dụ: é hoặc ç, phổ biến trong tên), Internet Explorer sẽ mã hóa chúng bằng tiếng Latin -1.

Điều này có nghĩa là nếu người dùng tìm kiếm "Ché Guevara", nó sẽ xuất hiện không chính xác ở phía máy chủ. Trong Ruby 1.9, điều này sẽ dẫn đến lỗi mã hóa khi văn bản chắc chắn xuất hiện trong công cụ biểu thức chính quy. Trong Ruby 1.8, nó sẽ dẫn đến kết quả bị hỏng cho người dùng.

Bằng cách tạo một tham số chỉ có thể hiểu bởi IE là một ký tự unicode, chúng tôi buộc IE phải xem thuộc tính accept-charset, sau đó bảo nó mã hóa tất cả các ký tự dưới dạng UTF-8, ngay cả những ký tự có thể được mã hóa bằng tiếng Latin-1.

Hãy nhớ rằng trong Ruby 1.8, việc lấy dữ liệu Latin-1 vào cơ sở dữ liệu UTF-8 của bạn là vô cùng đơn giản (vì không có gì trong toàn bộ ngăn xếp kiểm tra rằng các byte mà người dùng gửi tại bất kỳ điểm nào là ký tự UTF-8 hợp lệ). Kết quả là, các ứng dụng Ruby (và ứng dụng PHP, v.v.) cực kỳ phổ biến để thể hiện lỗi đối mặt với người dùng này và do đó cực kỳ phổ biến đối với người dùng để cố gắng thay đổi mã hóa như một biện pháp giảm nhẹ.

Tất cả những gì đã nói, khi tôi viết bản vá này, tôi đã không nhận ra rằng tên của tham số sẽ xuất hiện ở nơi đối diện với người dùng (nó thực hiện với các biểu mẫu sử dụng hành động GET, chẳng hạn như biểu mẫu tìm kiếm). Vì vậy, chúng tôi sẽ đổi tên tham số này thành _evà sử dụng một ký tự unicode trông vô hại hơn.


1
Nếu điều này kết thúc một tham số trong suốt như _method, có lẽ nó sẽ ít gây nhầm lẫn hơn. Thật là một điều điên rồ phải sửa chữa, mặc dù.
tadman

1
Cảm ơn vì đã trả lời chi tiết Yehuda - mặc dù tôi nghĩ giữ người tuyết là kết quả tốt nhất có lẽ là một trong những điều ngu ngốc mà 'doanh nghiệp' sẽ chọn - 'cái quái gì của người tuyết này?!? đây là một công việc, không phải là một trò chơi! '.. Ugh.
Matthew Savage

1
@Matthew, thật kỳ lạ là bạn đúng. Nhưng tôi cảm thấy như giải pháp là khá ấn tượng.
JP Silvashy

10
Snowman sau đó đã được thay thế bằng một đầu vào ẩn có tên utf8 với giá trị được đặt thành "& # x2713". Tôi sử dụng form_tag cho trình chuyển đổi ngôn ngữ của mình và bắt đầu có nhiều ngoại lệ vì một trình thu thập thông tin dường như có vấn đề với giá trị này và kết nối không chính xác tham số utf8 và giá trị của nó với giá trị của tùy chọn lựa chọn trong biểu mẫu.
Christer Fernstrom

56

Đây là ở đây để hỗ trợ Internet Explorer 5 và khuyến khích nó sử dụng UTF-8 cho các hình thức của nó.

Thông điệp cam kết nhìn thấy ở đây chi tiết như sau:

Khắc phục một số sự cố mã hóa web đã biết:

  • Chỉ định bộ ký tự chấp nhận trên tất cả các hình thức. Tất cả các trình duyệt gần đây, cũng như IE5 +, sẽ sử dụng mã hóa được chỉ định cho các tham số biểu mẫu
  • Thật không may, IE5 + sẽ không xem xét bộ ký tự chấp nhận trừ khi ít nhất một ký tự trong các giá trị của biểu mẫu không có trong bộ ký tự của trang. Vì người dùng có thể ghi đè bộ
    ký tự mặc định (mà Rails đặt thành UTF-8), chúng tôi cung cấp một đầu vào ẩn có chứa một ký tự unicode, buộc IE phải nhìn vào bộ ký tự chấp nhận.
  • Giờ đây, phần lớn đầu vào web là UTF-8, chúng tôi đặt các tham số gửi đến thành UTF-8. Điều này sẽ loại bỏ nhiều trường hợp mã hóa không tương thích giữa ASCII-8BIT và
    UTF-8.
  • Bạn có thể yên tâm bỏ qua params [: _ snowman]

Nói tóm lại, bạn có thể bỏ qua thông số này một cách an toàn.

Tuy nhiên, tôi không chắc tại sao chúng tôi hỗ trợ các công nghệ cũ như Internet Explorer 5. Có vẻ như đó là một quyết định không phải của Ruby on Rails nếu bạn hỏi tôi.


7
Báo giá nói rằng IE IE5 +, vì vậy có lẽ vấn đề cũng xảy ra trong các phiên bản IE mới hơn?
Phi

5
Để có câu trả lời dài hơn, vui lòng xem tại github.com/rails/rails/commit/iêu (cũng vậy, xem phản hồi của tôi bên dưới)
Yehuda Katz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.