2010-07-11 81 views
161

在Ruby on Rails 3(当前使用Beta 4)中,我看到当使用form_tagform_for助手时,会出现一个名为_snowman的隐藏字段,其值为☃(Unicode \ x9731)。Ruby on Rails 3表单中的_snowman参数是什么?

那么,这是什么?

+1

这是一个'文档'类型的问答 - 我试图在这里找到答案,并最终通过提交消息进行挖掘,所以我想我会在这里分享给那些想知道雪人的人...... – 2010-07-11 05:47:28

+0

另请参阅[本](http://programmers.stackexchange.com/q/168751/37622)。 – MasterMastic 2013-10-12 15:17:33

回答

55

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

的提交信息看到here细节,如下所示:

修复一些已知的网络编码问题:

  • 指定对所有形式的接收字符集。所有最新的浏览器,以及 IE5 +,将使用指定的 的编码形式参数
  • 不幸的是,IE5 +不会看接收字符集,除非在窗体的值至少一个 字符不是在页面的字符集 。由于 用户可以覆盖默认
    字符集(其Rails的集成UTF-8),我们 提供含有 Unicode字符隐藏的输入,迫使IE到 看看接收字符集。
  • 现在绝大多数Web输入都是UTF-8,我们将入站 参数设置为UTF-8。这将消除许多ASCII-8BIT和
    之间的不兼容 编码的情况,UTF-8编码为 。
  • 可以放心地忽略PARAMS [:_雪人]

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

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

+6

引用说“IE5 +”,所以也许这个问题也出现在较新的IE版本呢? – Philipp 2010-07-11 08:24:49

+5

如需更长时间的回复,请查看http://github.com/rails/rails/commit/25215d7285db10e2c04d903f251b791342e4dd6a#commitcomment-118076(另请参阅下面的回复) – 2010-07-27 22:23:39

292

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

具体来说,如果用户将浏览器的编码切换为Latin-1,则会触发此错误。要理解用户为什么决定做一些看起来如此疯狂的事情,请查看this google search。一旦用户将网站设置为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 2010-07-28 15:31:31

+1

感谢耶胡达的详细回应 - 虽然我认为保持雪人是最好的结果,它可能是那些愚蠢的事情之一'企业'会选择 - '这是什么雪人的东西?!?这是一个生意,而不是一个游戏!'.. 呃。 – 2010-07-29 04:21:30

+1

@Matthew,很奇怪你说得对。但我确实觉得这个解决方案非常令人印象深刻。 – 2010-08-25 19:51:46