2009年1月2日,星期五

本周 Edge Rails 动态

发布者 Mike Gunderloy

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

新年快乐!显然,Rails核心团队在新旧年交替之际并没有进行太多派对:边缘树(edge tree)迎来了35次提交,其中一些涉及非常实质性的工作。以下是我本周对一些最明显和最重要的更改的概述。

respond_to 方法优化

在Rails-Merb团队合并的一些早期成果中,Yehuda Katz 对 respond_to 方法进行了审查。这个方法在许多Rails应用程序中都得到了广泛使用,它允许你的控制器根据传入请求的 MIME 类型以不同的方式格式化结果。在消除了对 method_missing 的调用,经过一些性能分析和调整后,他报告称,在处理一个简单的 respond_to(在三种格式之间切换)时,每秒处理的请求数提高了8%。最棒的是什么?你的应用程序代码无需任何更改即可享受这种速度提升。 提交 提交

如果你想预览Rails 3还会有哪些新功能,可以看看Yehuda 的 Rails树的个人分支;我将继续关注这些更改,并将它们融入到边缘Rails(edge Rails)的主副本中。

Active Record 的动态作用域

你可能知道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 的 博客 上有关于此的进一步讨论。 提交

其他Active Record更新

本周Active Record有一些小变动。一系列提交清理了指定了 :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,你永远不会看到这些注释——但如果你正在帮助维护和改进框架,你就会欣赏它们。 提交