2009 年 1 月 2 日,星期五

Edge Rails 本周更新

撰稿人:Mike Gunderloy

2008 年 12 月 27 日 - 2009 年 1 月 2 日

新年快乐!显然,Rails 核心团队并没有在狂欢庆祝中结束旧的一年:我们有 35 个提交更新到了 Edge 版本分支,其中一些更新涉及非常实质性的工作。以下是本周我概览的一些非常引人注意且重要的更改。

优化 respond_to

作为 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 以报告已存在的记录。 虽然对这一变化的明智性存在讨论,但共识似乎是它不会造成损害,并且可能会减少一些开发者的惊奇感。 提交

HTTP摘要身份验证

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 添加测试覆盖率、删除 一些 假设,并且使 FCGIsqlite2 测试恢复运行。所有这些都是使 Rails 持续集成服务器 更实用以供前进的长期努力的一部分。正如您在查看当前构建状态时所见,虽然我们尚未完全实现,但我们正在接近目标。

顺便说一下,如果您想为 Rails 设置您自己的 CI 服务器,可以在源代码中找到 说明

用于元编程的代码注释

respond_to 所做更改的一个影响是,人们非常喜欢内联注释,这使得 class_eval 代码的意图清晰明了。因此,我们在 Rails 源代码中添加了许多类似的注释。例如


def #{method_name}     # def year
  time.#{method_name}  #   time.year
end                    # end

如果您只使用 Rails,那么您永远也看不到这些注释,但如果您正帮助维护和改进该框架,那么您将会感激它们的。 提交