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


174

在Ruby on Rails 3(当前使用Beta 4)中,我看到使用form_tagform_for帮助器时,会显示一个隐藏字段,其名称_snowman为field(Unicode \ x9731)。

那么,这是为了什么呢?


2
这是“文档”类型的问答-我试图在这里找到答案,并最终在提交消息中进行了挖掘,因此我想在这里与其他对雪人感到疑惑的人分享...
Matthew Savage

另请参阅
2013年

Answers:


307

将此参数添加到表单中是为了强制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之类的透明参数结尾,则可能会减少很多混乱。不过,必须解决的事情真是疯狂。
塔德曼,2010年

1
感谢您的详细答复。Yehuda-尽管我认为保留雪人是最好的结果,但它可能是“企业”会选择的那些愚蠢的事情之一-“这雪人到底是什么?!?这是生意,而不是游戏!”
马修·萨维奇

1
@马修,奇怪的是你是对的。但是我确实觉得解决方案非常出色。
JP Silvashy 2010年

10
此后,雪人已被名为utf8的隐藏输入所替代,其值设置为“&#x2713”。我将form_tag用于我的语言切换器,并开始遇到很多异常,因为一个搜寻器似乎对此值有问题,并且错误地将utf8参数及其值与表单中选择选项的值连接在一起。
Christer Fernstrom
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.