昨天是美国开发者们的感恩节假期——但这周的 Rails 前沿动态可一点也不像在过节。事情进展得很快,Rails 2.3 版本迎来了一些重大变化。
script/server 的底层已经得到简化和重写。原来 script/server 中支持服务器的显式列表已移除。现在 Rails 依赖于安装 Rack,并且 script/server 通过它来工作——这意味着 Rails 支持 Rack 支持的任何服务器。
本周路由方面有几项重大变化。formatted_ 路由助手已被移除,取而代之的是直接将 :format 作为选项传递。这使得任何资源的路由生成过程缩短了 50%——并且可以节省大量内存(根据 Lighthouse 票据,大型应用程序可节省高达 100MB)。如果您的代码使用了 formatted_ 助手,目前它仍然有效——但这种行为已被弃用,如果您使用新标准重写这些路由,您的应用程序将更高效。另一个重大变化是 Rails 现在支持多个路由文件,而不仅仅是 routes.rb。您可以使用 RouteSet#add_configuration_file 在任何时候引入更多路由——而无需清除当前已加载的路由。提交 提交
第二项路由更改使得对 Rails 引擎的支持更好:引擎中的路由文件现在可以自动加载和重新加载(其他插件中的也是如此)。除了路由之外,引擎也得到了一些改进。如果您的插件有一个 app 文件夹,那么 app/[models|controllers|helpers] 将会自动添加到 Rails 的加载路径中。关于这应该如何工作以及从当前引擎插件中获取多少信息,目前有 活跃的讨论,所以这方面可能还会有更多提交。引擎也支持添加视图路径了。提交 提交 提交 提交
如果您是 Thoughtbot 的 Quiet Backtrace 插件的用户,该插件允许您选择性地从 Test::Unit 堆栈跟踪中删除行,那么您会很高兴发现核心代码中加入了 ActiveSupport::BacktraceCleaner 和 Rails::BacktraceCleaner。这支持过滤器(对堆栈跟踪行执行基于正则表达式的替换)和静默器(完全删除堆栈跟踪行)。Rails 会自动添加静默器来清除新应用程序中最常见的噪音,并构建一个 config/backtrace_silencers.rb 文件来存放您自己的添加项。提交
一系列的提交继续推动向 Ruby 1.9 和 minitest 兼容性发展。这应该能确保 Rails 2.3 在发布时已准备好支持最新的 Ruby 底层。但请注意,目前使用最前沿版本的开发者:edge Rails 的 更改 之一依赖于尚未在 ruby-core 中应用的 ruby-core 补丁。您还(暂时)需要获取 Jeremy Kemper 的 Mocha 分支 以兼容 MiniTest,这是 此提交 所要求的。
Jeremy Kemper 和 Josh Peek 在确保 Rails(及其依赖项)的某些部分仅在实际需要时才加载到内存中方面付出了大量努力。请查看 11 月 23 日的提交,其中包含大量惰性加载的更改。核心框架——Active Support、Active Record、Action Controller、Action Mailer 和 Action View——现在使用 autoload 来惰性加载它们各自的类。这项工作应该有助于降低内存占用并提高 Rails 的整体性能。提交 提交 提交 提交 提交
您可以通过指定新的 preload_frameworks 选项来决定核心库是否应在启动时自动加载。默认值为 false,这样 Rails 会逐个组件自动加载,但在某些情况下您仍然需要一次性加载所有内容——Passenger 和 JRuby 都希望看到所有 Rails 组件被一起加载。提交
在 edge Rails 中,资源主机变得更加灵活,可以将资源主机声明为一个响应调用的特定对象。DHH 提供了一个示例项目,asset-hosting-with-minimum-ssl,它演示了此功能的一个良好用例。提交
现在您可以通过设置 ActionController::Base.helpers_dir 来配置 Rails 应用程序的助手文件夹位置。这在某些不寻常的情况下会很有用——最初的 用例 是为构建一个鼓励通过插件扩展而非修改应用程序本身的 Rails 应用程序。提交
用于 CSRF 保护的令牌生成已简化;现在 Rails 使用 ActiveSupport::SecureRandom 生成的简单随机字符串,而不是操作会话 ID。因此,protect_from_forgery 的 :digest 和 :secret 选项已被弃用,在 edge 版本中没有效果。提交
说到秘密,有些人会发现 ActiveSupport::MessageEncryptor 有新用途,它提供了一种简单的方法来加密信息,以便存储在不受信任的位置(如 cookie)。提交
Active Support 的 from_xml 不再依赖 XmlSimple。现在 Rails 包含了自己的 XmlMini 实现,只有它需要的功能。这样 Rails 就可以摆脱一直以来携带的 XmlSimple 副本了。提交 提交
您可能还记得,上周的改进包括将 application.rb 重命名为 application_controller.rb。本周新增了一个 rake 任务 rake rails:update:application_controller 来自动完成此操作——它将作为正常 rake rails:update 过程的一部分运行。提交
对于使用 ActiveSupport::OrderedHash 的用户是个好消息:它现在实现了 each_key 和 each_value。提交
核心 Rails 的又一个部分支持 I18n:number_to_human_size 使用的单位。如果您正在维护一个翻译文件,需要在您的翻译中添加 storage_units: [Bytes, KB, MB, GB, TB]。提交
对 Rails 组件的支持——这个组件在《敏捷 Web 开发(使用 Rails)》中曾被称为“冲动超越审慎的绝佳范例”——最终被移除了。如果几年前关于此弃用的警告还不够,那么现在是时候找到一个替代解决方案了。提交
/public 目录中与 CGI 和 FCGI 分派相关的各种文件不再默认生成在每个 Rails 应用程序中(如果您需要它们,仍然可以通过在运行 rails 命令时添加 --with-dispatches 来获得,或者稍后使用 rake rails:generate_dispatchers 添加)。提交 提交
温馨提示:我在这里并不提供每一个提交的链接,只是试图突出重点。本周的 edge 更改实际包含了来自众多贡献者的 136 个提交。