在 Ruby on Rails 3 表单中,"_snowman" 参数是用来做什么的?

177
在 Ruby on Rails 3 中(目前使用的是 Beta 4 版本),当使用 form_tagform_for 辅助函数时,会看到一个名为 _snowman 的隐藏字段,其值为 ☃(Unicode \x9731)。

那么,这是用来做什么的呢?

2
这是一个“文档”类型的问答 - 我试图在这里找到答案,最终翻阅了提交消息,所以我想在这里分享给其他想知道关于雪人的人。 - Matthew Savage
请参阅此链接 - MasterMastic
2个回答

309

为了强制 Internet Explorer (5、6、7 和 8) 将其参数编码为 Unicode,该参数被添加到表单中。

具体而言,如果用户将浏览器的编码切换为 Latin-1,就会触发此错误。要理解为什么用户会做出看似如此疯狂的决定,请查看这个 Google 搜索。一旦用户将网站置于 Latin-1 模式下,并且使用可以同时被视为 Latin-1 和 Unicode 的字符(例如 é 或 ç,在姓名中很常见),Internet Explorer 将对它们进行 Latin-1 编码。

这意味着,如果用户搜索“Ché Guevara”,服务器端将收到不正确的结果。在 Ruby 1.9 中,当文本不可避免地进入正则表达式引擎时,会导致编码错误。在 Ruby 1.8 中,它将导致用户获得损坏的结果。

通过创建一个只能被 IE 理解为 Unicode 字符的参数,我们迫使 IE 查看 accept-charset 属性,然后告诉它将所有字符编码为 UTF-8,甚至可以在 Latin-1 中编码的字符也要这样做。

请记住,在 Ruby 1.8 中,非常容易将 Latin-1 数据放入 UTF-8 数据库中(因为整个堆栈中没有任何内容检查用户发送的字节是否是有效的 UTF-8 字符)。因此,Ruby 应用程序(以及 PHP 应用程序等等)很容易出现这种用户界面错误,用户也因此经常尝试更改编码方式作为一种缓解措施。

所有这些都说了,当我编写这个补丁时,我没有意识到该参数的名称会出现在用户界面上(例如使用 GET 操作的搜索表单),但实际上确实如此。因此,我们将把此参数重命名为_e,并使用一个看似无害的 Unicode 字符。


1
如果这最终成为一个像_method一样的透明参数,那么它可能会少很多混淆。不过,这确实是一件疯狂的事情需要修复。 - tadman
1
谢谢你详细的回复,Yehuda。虽然我认为保留雪人是最好的结果,但这可能是那些“企业”会挑剔的愚蠢事情之一——“这个雪人到底是什么?!这是一个商业场合,不是游戏!”真是烦人。 - Matthew Savage
1
@Matthew,说实话你是对的。但我觉得这个解决方案相当令人印象深刻。 - JP Silvashy
11
雪人(Snowman)已被一个名为utf8的隐藏输入所取代,其值设置为"&#x2713"。我使用form_tag来实现语言切换器,但出现了很多异常情况,因为似乎有一种网络爬虫无法处理这个值,并且错误地将utf8参数及其值与表单中选择选项的值连接在一起。 - Christer Fernstrom

56

这段代码用于支持Internet Explorer 5并鼓励其使用UTF-8表单。

此处链接详细说明如下:

修正了几个已知的Web编码问题:

  • 在所有表单上指定accept-charset。所有近期浏览器和IE5+将使用为表单参数指定的编码
  • 不幸的是,除非表单值中至少有一个字符不在页面字符集中,否则IE5+不会查看accept-charset。由于 用户可以覆盖默认的字符集(Rails设置为UTF-8),因此我们提供了一个包含Unicode字符的隐藏输入, 强制IE查看accept-charset。
  • 现在,绝大多数网络输入都是UTF-8,所以我们将入站参数设置为UTF-8。这将消除许多ASCII-8BIT和UTF-8之间 不兼容编码的情况。
  • 您可以安全地忽略params[:_snowman]。

简而言之,您可以安全地忽略此参数。

尽管如此,我仍不确定为什么要支持像Internet Explorer 5这样的旧技术。在我看来,这似乎是非常与Ruby on Rails不符的决定。


7
这句话引用了“IE5+”,那么也许问题也会在更新的IE版本中出现? - Philipp
5
若需要更详细的回答,请查看http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076(同时请看下面我写的回复)。 - Yehuda Katz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接