
距离上次 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 API:
ActiveModel::Compliance.test(object)
输出类似于 Test::Unit 的输出,并会指示给定对象符合 ActiveModel API 的哪些部分 - 更重要的是,不符合哪些部分。
如果您喜欢 Metal,您可能想看看 Yehuda Katz 最近的博客文章 “How to Build Sinatra on Rails 3”。
ActiveRecord 及其相关组件发生了很多变化,大小不一。其中大部分清理了现有功能,使其更易于使用,性能更接近预期,甚至添加了一些新功能,这些新功能很快就会变得熟悉。
Taryn East 为 ActiveResource 添加了一些类似 ActiveRecord 的功能。在此补丁中,ActiveResource 获得了熟悉的 first、last 和 all 快捷方法,用于包装基本的 find 方法。
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 标签助手(默认是“请选择”)的提示文本添加了本地化支持。
最后,这无疑是一个受欢迎的补充,也是 Rails 中本地化支持的一个潜在重要参与者:Antonio Tapiador del Dujo 添加了一个补丁,允许 Rails 插件定义和维护自己的 locale 文件。插件开发者所要做的就是在他们的插件内提供一个 config/locales/ 目录,然后创建自己的 .rb 或 .yml 文件(例如 en.yml)。这意味着插件现在可以更多地负责自己的本地化支持,而无需在安装后修改应用程序的 locale 文件。
最后,一个小说明是,MySQL 的默认首选表排序规则已被更改。以前,如果数据库或表创建脚本没有另行指定,Rails 默认使用 utf8_general_ci。现在,已更改为 utf8_unicode_ci。考虑到许多 Rails 应用程序都在后端使用 MySQL,这一点绝对值得注意。
更新:将 previous_changes 的归属权设置为 Scott Barr。抱歉,Scott!
照片:Alex E. Proimos 的 胡佛大坝的安全