Ruby on Rails 3 表单中的 _snowman 参数有啥用?

Posted

技术标签:

【中文标题】Ruby on Rails 3 表单中的 _snowman 参数有啥用?【英文标题】:What is the _snowman param in Ruby on Rails 3 forms for?Ruby on Rails 3 表单中的 _snowman 参数有什么用? 【发布时间】:2011-03-14 09:57:54 【问题描述】:

在 Ruby on Rails 3(当前使用 Beta 4)中,我看到在使用 form_tagform_for 助手时,有一个名为 _snowman 的隐藏字段,其值为 ☃ (Unicode \x9731)出现了。

那么,这是干什么用的?

【问题讨论】:

这是一个“文档”类型的问答 - 我试图在这里找到答案并最终挖掘了提交消息,所以我想我会在这里与其他想了解雪人的人分享。 .. 另见this。 【参考方案1】:

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

具体来说,如果用户将浏览器的编码切换为 Latin-1,就会触发此错误。要了解为什么用户会决定做一些看似如此疯狂的事情,请查看this google search。一旦用户将网站设置为 Latin-1 模式,如果他们使用可以理解为 Latin-1 和 Unicode 的字符(例如,é 或 ç,在名称中很常见),Internet Explorer 会将它们编码为拉丁语-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 数据库非常简单(因为整个堆栈中的 nothing 会检查用户发送的字节任何点都是有效的 UTF-8 字符)。因此,Ruby 应用程序(以及 php 应用程序等)表现出这种面向用户的 bug 是非常常见的,因此用户尝试更改编码作为一种缓解措施是非常常见的。

说了这么多,当我编写这个补丁时,我没有意识到参数的名称会出现在面向用户的地方(它会出现在使用 GET 操作的表单中,例如搜索表单)。既然如此,我们将把这个参数重命名为_e,并使用一个看起来更无害的unicode字符。

【讨论】:

如果这最终是一个像_method这样的透明参数,它可能会少很多混乱。不过,这是多么疯狂的事情。 感谢 Yehuda 的详细回复——虽然我认为保留雪人是最好的结果,但它可能是“企业”会选择的那些愚蠢的事情之一——“这个雪人到底是什么东西?!?这是生意,不是游戏!'.. 呃。 @Matthew,奇怪的是你是对的。但我确实觉得这个解决方案令人印象深刻。 Snowman 已被一个名为 utf8 的隐藏输入取代,其值设置为“✓”。我为我的语言切换器使用了 form_tag 并开始出现很多异常,因为一个爬虫似乎有这个值的问题,并且错误地将 utf8 参数及其值与表单中的选择选项的值连接起来。【参考方案2】:

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

看到here的提交消息详细如下:

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

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

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

不过,我不确定我们为什么要支持 Internet Explorer 5 等旧技术。如果你问我,这似乎是一个非常非 Ruby on Rails 的决定。

【讨论】:

报价单上写着“IE5+”,那么新的IE版本也可能出现问题? 如需更冗长的回复,请查看github.com/rails/rails/commit/…(另请参阅下面的回复)

以上是关于Ruby on Rails 3 表单中的 _snowman 参数有啥用?的主要内容,如果未能解决你的问题,请参考以下文章

通过单击 Ruby on Rails 中的按钮生成表单

Ruby on Rails 表单中的枚举选择映射值

Ruby on Rails 表单中的 select 和 onChange

Ruby on Rails 表单添加带有文本框的“其他”选项以选择下拉菜单

Ruby on Rails:提交表单时“您想要的更改被拒绝”

如何根据 Ruby on Rails 中的表单选择创建文本框警报/悬停弹出文本?