Ruby on Rails 3表单中的_snowman参数是什么?

在Ruby on Rails 3(目前使用Beta 4)中,我发现当使用form_tagform_for helpers时,会出现一个名为_snowman的隐藏字段,其值为☃( Unicode \ x9731)。

那么,这是为了什么?

此参数已添加到表单中,以强制Internet Explorer(5,6,7 8)将其参数编码为unicode。

具体而言,如果用户将浏览器的编码切换为Latin-1,则可能会触发此错误。 要理解为什么用户会决定做一些看起来如此疯狂的事情,请查看这个谷歌search 。 一旦用户将网站设置为Latin-1模式,如果他们使用可以理解为Latin-1和Unicode的字符(例如,名称中常见的é或ç),则Internet Explorer将使用Latin -1。

这意味着如果用户search“ChéGuevara”,它将在服务器端不正确地通过。 在Ruby 1.9中,当文本不可避免地进入正则expression式引擎时,会导致编码错误。 在Ruby 1.8中,这会导致用户的结果被破坏。

通过创build一个只能被IE理解为unicode字符的参数,我们迫使IE查看accept-charset属性,然后告诉它将所有字符编码为UTF-8,甚至可以编码在拉丁语-1。

请记住,在Ruby 1.8中,将Latin-1数据放入UTF-8数据库是非常简单的(因为整个堆栈中没有任何内容会检查用户在任何点发送的字节是否为有效的UTF-8字符)。 因此,Ruby应用程序(以及PHP应用程序等)显示这种面向用户的错误是非常常见的,因此用户尝试将编码更改为缓和措施非常普遍。

所有这一切,当我写这个补丁,我没有意识到,参数的名称将永远出现在面向用户的地方(它使用GET操作的forms,如search表单)。 _e ,我们将把这个参数重命名为_e ,并使用一个更无害的unicode字符。

这是为了支持Internet Explorer 5,并鼓励它使用UTF-8格式。

这里看到的提交信息详细说明如下:

修复几个已知的网页编码问题:

  • 在所有表单上指定accept-charset。 所有最近的浏览器,以及IE5 +都将使用为表单参数指定的编码
  • 不幸的是,IE5 +不会查看accept-charset,除非表单的值中至less有一个字符不在页面的字符集中。 由于用户可以覆盖默认值
    charset(Rails设置为UTF-8),我们提供一个包含unicode字符的隐藏input,迫使IE查看accept-charset。
  • 现在绝大多数Webinput都是UTF-8,我们将入站参数设置为UTF-8。 这将消除许多ASCII-8BIT与之间不兼容的编码情况
    UTF-8。
  • 你可以放心地忽略params [:_ snowman]

总之,你可以放心地忽略这个参数。

不过,我不确定为什么我们要支持Internet Explorer 5这样的老技术。如果你问我的话,这看起来像是非Ruby on Rails的决定。