2009 年 4 月 17 日星期五

本周的 Rails

Mike Gunderloy 张贴

2009 年 4 月 4 日至 4 月 17 日

万一您错过了新闻:edge Rails 正在唤醒,Rails 3 变化开始显示在 Github 的 master 分支中。因此本周有很多东西要讨论。如果您想了解到目前为止的某些 Rails 3 重构技术观点,请查看 Yehuda Katz 的详细博文。

我应该使用哪个分支?

Rails 3.0 正在 Github 上的 Rails 代码库中的 master 分支上进行。如果您想继续关注所有最新变化,这个分支值得跟踪 - 警告是这是当前的 alpha 代码。使用 master 分支完全可以构建工作 Rails 应用程序。Rails 核心团队致力于保持 master 分支通过所有测试,而事实上提高我们的测试覆盖和持续集成策略都是作为 Rails 3 改进来敲定的。但认识到 Rails 的变化会导致许多插件在可用于 Rails 3 之前需要重写(当然,某些插件需要的更新比其他更新多),这点十分重要。这将使得 Rails 3 在一段时间内难以用于全面生产部署。

对于现有生产应用程序,您应在 Github 上跟踪 2-3-stable 分支上的更改。该分支包含对 2.3 发行版代码的错误修复和改进,并应继续与您正在使用的插件和代码保持兼容。

我应该向 Rails 提交补丁吗?

当然!Rails 一直是 社区工作,并且不会改变 Rails 3。我们欢迎针对 Rails 2.3 或 Rails 3.0 的补丁 - 请在 Lighthouse 票证中使用适当的标签(2-3-stable 或 3.0),以便轻松了解您已测试并根据其进行补丁的分支。为 Rails 做贡献指南将帮助您完成向 Rails 提交补丁的机制。

David 概述了 Rails 3 的整体愿景在 12 月份,那仍然是基本计划。如果您特别希望参与其中某部分,Ruby on Rails: Core 邮件列表将帮助您联系开发人员以协调计划 - 并且可能省去一些麻烦。大部分主要工作已经在进行中,但我们知道社区的想法和贡献对于 Rails 3 的成功至关重要。

Rails 2.3.x 更改

说到 Rails 2.3,最近几周,一些错误修复已经部署,并且一个有趣的新功能:ActiveRecord::Base#touch。其理念是,您可以做一个快捷方式,将当前时间推送到记录的 updated_atupdated_on 时间戳字段


@customer.touch

这不仅节省了一些击键操作,而且还作为 belongs_to 关联的一个选项实现


class Order < ActiveRecord::Base
	belongs_to :customer, :touch => :last_order_update
end

有了此声明,保存或销毁一个 order 对象将接触相应的父客户对象。当您尝试在此情况下使父的缓存副本失效时,这可能非常方便。

commit commit

Rails 3.0 更改内容

ActiveRecord::Base#touch 进入 2.3 分支时,它也会同时添加到 Rails 3.0 中。一般来说,情况应该如此:Rails 2.3 中的新功能将进入 Rails 3。核心团队正在努力确保在将版本更改时,轻松升级和兼容。但本周还有一些仅适用于 Rails 3 的其他更改:这就是此帖子的其他内容。

模块组织

Rails 代码中有一些位置,它们有多个包含、继承和设置级别。作为使其更容易遵循进行中操作的一部分,Rails 3 引入了新的 depends_onusesetup 抽象。这些可以使阅读代码的意图更明确


module AbstractController
  module Helpers
    depends_on Renderer
 
    setup do
      ...
    end
    ...
  end
end

module ActionController
  class Base2 < AbstractBase
    use AbstractController::Callbacks
    use AbstractController::Helpers
    ...
  end
end

commit 更多信息

AbstractController

到目前为止,Rails 3 中最大的架构更改可能是引入了 AbstractController 基本类。这是 ActionController::BaseActionMailer::Base 之间共性的新实现,最终将作为 Rails 中 Merb 部分的模拟类。其意图不是提供插件或应用程序将直接使用的代码,而是构建一个强大的底层 API,其他内容可以依靠此类。例如,AbstractController 的使用者将能够为模板实现自已的路径查找逻辑,或为基本的 render 方法添加其他选项。

commit commit 更多信息

ActionDispatch

另一个内部架构更改是引入ActionDispatchActionDispatch作为Action Pack系列的新成员,是此前被塞入ActionController中的所有各种HTTP库和中间件的家,包括请求处理、参数解析、状态代码和我们捆绑的Rack副本。commit

定义表面区域

Rails 3工作的一个目标是清楚地区分插件和应用程序代码可以依赖的公开API方法,以及受变更影响的Rails内部结构。有关此内容的一个示例,你可以查看对ActionView::Template所做的某些重构。此处,所做更改是标识不受其他类使用的这些方法,并使其变为私有。这会立即使类的预期API变得更易于理解,而且从长远来看,将有助于为插件提供如何与核心代码交互的契约。在正式标识当前表面区域后,很可能将它缩小,从而获得更清晰的外部APIcommit

AJAX和真实性令牌

如果你已经手工编写了很多javascript,你会发现,将Rails真实性令牌包括在请求中非常麻烦。对问题进行更详细的分析表明,这些令牌在AJAX请求中没有必要,因为同源策略会保护它们。因此,Rails 3不再在AJAX请求中检查这些令牌,这样你就不必再编写丑陋的javascript代码了。commit

测试改进

Rails 3的另一个关注领域是,将内部测试方法改进到当前的最佳实践。在现有代码中,有许多测试点不够系统 - 已经使用测试覆盖率检查更改,但是还没有人尝试确保对所有正常的“正常”代码路径进行全面测试覆盖。有关此领域内正在发生的事情的简要说明,请查看actionpack/test/new_base中的某些测试文件(new_base代码是ActionController::Base的重写进行时)。我们还在积极努力完善我们的持续集成情节,同时一起编写出一些基本高级集成测试,这些测试可以对Rails整体进行演练。

未尽事宜

目前,master 版本未实现一些 Rails 2.3 功能。有些更改无法与新架构干净合并,其他更改则采用不同的方式重新实现。你可以在此 提交消息 中找到一些具体内容,但缺少的部分包括开发模式渲染的性能提升、生产环境中的模板重新编译以及一些模板选择逻辑。从事 Rails 3 开发的工作人员已表示,他们打算尽快恢复功能奇偶校验。事实上,rails-dev-boost 更改的首次通过已经 提交

已移除:CGI 支持

Rails 3 不会支持直接 CGI 调度。这已在 Rails 2.3 中弃用,因此完全移除它在任何人的意料之中。但如果你因某些原因需要使用 CGI,请记住,它仍通过 Rack 获得支持。 提交