自上次 WNiER (“winner”?) 帖子以来已经过了两个多星期了,在此期间,我们上次访问时,Ruby on Rails 2.3.4 发布以修复一些已报告的安全问题。如果可以的话,尽快尝试升级应用程序非常重要,或者如果你在当前情况下无法轻松完成全部升级,只需应用提供的补丁程序即可。
除了此版本外,你还会看到 Rails 框架的几个错误修复及增强功能,它们来自许多贡献者,在过去的几周中在这里已经讨论过,甚至还有一些将在下面提到。
Michael Koziarski 发布了修复程序(此处和此处),用于清理和验证多字节(Unicode)字符串。此问题由 Brian Mastenbrook 报告,Manfred Stienstra 为修复提供了输入。这些更改应该可以禁止错误格式的 Unicode 字符串通过表单帮助程序提供的 HTML 转义逻辑。
Coda Hale 报告并还添加了一个补丁到 Rails 中,修复了ActiveSupport::MessageVerifier
中的时序攻击漏洞。虽然在实际环境中不太可能被利用,但此漏洞可能会使攻击者伪造对你应用程序的 Cookie 存储区进行编码的签名。如果成功攻破,攻击者可以在不更改应用程序的情况下修改其会话对象。
一些问题已在 Rails 2.3.4 版本中报告,特别是与 Ruby 1.9 支持相关。虽然尚未对所有问题进行彻底验证,但这无疑强调了为你的应用程序进行适当的测试覆盖和准备暂存和生产环境的重要性。
Yehuda Katz 和 Carl Lerche 最近在ActionController::Metal
和 Rack 的中间件上投入了大量工作。ActionController::Metal
现在用作 Rack 中间件,同时新增了一个ActionController::Middleware
类,作为常规 Rack 中间件运行。
如果这还不够,Yehuda 接着添加了ActiveModel::Lint
。ActiveModel::Lint
允许你通过
ActiveModel::Compliance.test(object)
输出类似于 Test::Unit 输出,它将指出给定对象与其哪一部分 ActiveModel API 相符或不符,后者更为重要。
如果喜欢 Metal,那么可以阅读 Yehuda Katz 最近的博客文章 How to Build Sinatra on Rails 3。
ActiveRecord 及其相关方面发生了一些小的改动和大的改动。大部分改动简化了一些现有功能,从而让这些功能更易于使用,使其性能更贴近预期,甚至添加了一些很快就会成为老朋友的新功能。
Taryn East 为 ActiveResource 增加了一点类似于 ActiveRecord 的友善功能。此补丁 中,ActiveResource 接受了为包装基本 find
方法而熟悉的 first
、last
和 all
快捷方式方法。
Kane 向 validates_numericality_of
ActiveRecord 验证添加了 Proc 和符号支持。
对于那些在生成 URL 时使用 :anchor
选项的用户而言,可能会注意到,在 Jeffrey Hardy 的 此补丁 之后,Rails 现在将对作为 :anchor
提供的对象执行 to_param
方法。
@post = Post.first
@comment = Comment.first
post_url(@post, :anchor => @comment) # => http://www.example.com/posts/1#comment-1
嗯,无论如何,类似于此。:) 这会更新 :anchor
选项,使其具有与在生成 URL 时提供的其他选项类似的功能。
José Valim 清理了 Rails 脚手架中的某些位。生成的 new
和 edit
视图现在将 引用 一个新的 _form
部分。这是一种更 DRY 的方法,且更贴近自己编码时的预期结果。此外,在修改过程中,他还 删除了一部分 内联 CSS(特别是,消息闪烁为绿色),而使用了一部分 CSS 类并更新了默认脚手架样式表。
而且,本组中最有趣的变更可能是添加了由 Scott Barr 添加的 新 ActivRecord#previous_changes
方法。借助 previous_changes
,您可以在本地 ActiveRecord 对象实例中查看上一次保存前的变更内容。这在调用可能需要知道到底有哪些变更的 after_save
方法时特别有用。我会让他给您一个代码示例
person = Person.find_by_name('bob')
person.name = 'robert'
person.changes # => {'name' => ['bob, 'robert']}
person.save
person.changes # => {}
person.previous_changes # => {'name' => ['bob, 'robert']}
person.reload
person.previous_changes # => {}
虽然我们许多人更喜欢使用美式英语,但我们(不情愿地)承认我们并不总是宇宙的中心。因此,Edge Rails 中还有一些本地化更新要报告
Sven Fuchs 为 ActiveRecord::RecordInvalid 异常的错误消息添加了 本地化支持。然后,Akira Matsuda 在 Sven 的基础上,为本地化 SELECT 标签帮助器的 提示文本(默认值为“Please select”)添加了支持。
最后,这绝对是一个受欢迎的添加项,而且有可能是 Rails 中本地化支持的一项主要内容:Antonio Tapiador del Dujo 添加了一个补丁,该补丁允许 Rails 插件定义和维护 它们自己的区域设置文件。对于插件开发人员而言,只需要在他们的插件中提供一个 config/locales/
目录,然后创建他们自己的 .rb
或 .yml
文件(即 en.yml
)即可。这意味着插件现在对它们自己的本地化支持负责的程度可以更大,而且它们在安装后不必修改应用程序的区域设置文件。
最后,只需简要提示一下,MySQL 的默认最佳表整理已 更改。以前,如果数据库或表创建脚本并没有另行规定,Rails 默认采用 utf8_general_ci
。现在,它已更改为 utf8_unicode_ci
。对于在后端使用 MySQL 的众多 Rails 应用程序而言,肯定值得注意。
更新:将 previous_changes
的归属设为 Scott Barr。抱歉,Scott!
图片:胡佛大坝的安全性,作者:Alex E. Proimos