新年快乐!显然,Rails 核心团队并没有在狂欢庆祝中结束旧的一年:我们有 35 个提交更新到了 Edge 版本分支,其中一些更新涉及非常实质性的工作。以下是本周我概览的一些非常引人注意且重要的更改。
作为 Rails-Merb 团队合并后产生的第一个成果,Yehuda Katz 着手研究了 respond_to
方法,该方法当然在许多 Rails 应用程序中被广泛使用,以便根据传入请求的 MIME 类型,允许控制器以不同的格式设置结果。在消除对 method_missing
的调用以及一些性能分析和调整后,他报告说,在使用在三种格式之间切换的简单 respond_to
时,每秒处理的请求数量提升了 8%。最棒的部分是?完全不需要更改应用程序的代码即可利用此优化带来的速度提升。 提交 提交
如果你想预览 Rails 3 还有什么期待之处,你可能想要了解 Yehuda 的 Rails 版本分支;我会在这些更改回到 Edge Rails 的主拷贝时进行介绍。
你了解 Rails 中的动态查找器(它允许你随手调制诸如 find_by_color_and_flavor
之类的函数),也了解已命名范围(它允许你将可重复使用的查询条件封装到 currently_active
之类的友好名称中)。那么,现在你已经可以拥有动态范围方法了。其理念是将语法组合起来,使其能够动态过滤和方法链接。例如
Order.scoped_by_customer_id(12)
Order.scoped_by_customer_id(12).find(:all,
:conditions => "status = 'open'")
Order.scoped_by_customer_id(12).scoped_by_status("open")
Ryan Daigle 的 博客 上对此进行了进一步的讨论。 提交
本周在活动记录中进行了几个更改。三个提交对 :primary_key
选项指定时的关联行为进行了一些清理。 提交 提交 提交
另一个方面是,ActiveRecord::Base#new_record?
现在返回 false 而不是 nil 以报告已存在的记录。 虽然对这一变化的明智性存在讨论,但共识似乎是它不会造成损害,并且可能会减少一些开发者的惊奇感。 提交
Rails 现在内置支持HTTP摘要身份验证。要使用它,您可以调用带有返回用户密码的块的authenticate_or_request_with_http_digest
(它随后被哈希并用于与已发送凭据进行比较)
class PostsController < ApplicationController
Users = {"dhh" => "secret"}
before_filter :authenticate
def secret
render :text => "Password Required!"
end
private
def authenticate
realm = "Application"
authenticate_or_request_with_http_digest(realm) do |name|
Users[name]
end
end
end
现在,当使用 Active Record 回调时,您可以在同一回调上组合:if
和:unless
选项,并以数组的形式提供多个条件
before_save :update_credit_rating, :if => :active,
:unless => [:admin, :cash_only]
一些突发活动清理了 Rails 本身的测试策略中的部分松散环节。这包括 不在 Windows 上运行符号链接测试、为 Rails::TemplateRunner
添加测试覆盖率、删除 一些 假设,并且使 FCGI 和 sqlite2 测试恢复运行。所有这些都是使 Rails 持续集成服务器 更实用以供前进的长期努力的一部分。正如您在查看当前构建状态时所见,虽然我们尚未完全实现,但我们正在接近目标。
顺便说一下,如果您想为 Rails 设置您自己的 CI 服务器,可以在源代码中找到 说明。
对 respond_to
所做更改的一个影响是,人们非常喜欢内联注释,这使得 class_eval
代码的意图清晰明了。因此,我们在 Rails 源代码中添加了许多类似的注释。例如
def #{method_name} # def year
time.#{method_name} # time.year
end # end
如果您只使用 Rails,那么您永远也看不到这些注释,但如果您正帮助维护和改进该框架,那么您将会感激它们的。 提交