Rails 3.0 的开发已经进行了两年,因此,我们非常高兴地宣布它终于发布了。我们汇集了超过 1600 位贡献者的辛勤劳动,让一切变得更好、更快、更干净、更美观。
Rails 的第三代经历了数千次提交,因此挑选要重点介绍的内容始终是一项艰巨且不完整的任务。但这里精选了一些 Rails 3 的主要更改。
新的 Active Record 查询引擎
Active Record 采用了 ARel 查询引擎,使作用域和查询更加一致且易于组合。这使得迭代构建复杂查询变得更加容易。我们还延迟了查询的实际执行,直到需要为止。这是一个简单的例子:
<pre style="font-size: 12px">users = User.where(:name => "david").limit(20) users = users.where("age > 29")</p>
- SELECT * FROM users
- WHERE name = “david” AND age > 29
- ORDER BY name
- LIMIT 20
users.order(:name).each { |user| puts user.name }</pre></code>
在 新的 Active Record 指南中了解更多信息,并观看 Rails 3 入门:ARel 视频。
Action Controller 的新路由器
当我们在 Rails 2 中切换到基于 REST 的控制器方法时,我们在等待实验是否成功的同时,对现有路由器进行了语法修补。
事实证明是成功的,因此在 Rails 3 中,我们重新审视并彻底重写了语法,以支持 REST 风格,减少了噪音,增加了灵活性。
<pre style="font-size: 12px">resources :people do resource :avatar collection do get :winners, :losers end end</p>
end
- /sd34fgh/rooms
scope ‘:token’, :token => /\w{5,5}/ do
resources :rooms
end
- /descriptions
- /pl/descriptions
- /en/descriptions
scope ‘(:locale)’, :locale => /en|pl/ do
resources :descriptions
root :to => ‘projects#index’
end</pre></code>
在 新的路由指南中了解更多信息。
新的 Action Mailer
Action Mailer 最初的设计是混合模型和控制器的功能。在 Rails 3 中,我们决定将其完全重写为控制器。这意味着它的感觉和功能将更接近 Action Controller,实际上它们现在共享了许多底层代码。这是它当前样子的预览:
<pre style="font-size: 12px">class Notifier < ActionMailer::Base default :from => "Highrise <system@#{APPLICATION_DOMAIN}>" def new_project(digest, project, person) @digest, @project, @person = digest, project, person attachments[‘digest.pdf’] = digest.to_pdf attachments[‘logo.jpg’] = File.read(project.logo_path) mail( :subject => “Your digest for #{project.name}”, :to => person.email_address_with_name ) do |format| format.text { render :text => “Something texty” } format.html { render :text => “Something texty” } end end end</p>
end</pre></code>
新的 Action Mailer 构建在 新的 Mail gem 之上。告别 TMail 的烦恼。
在 新的 Action Mailer 指南中了解更多信息。
使用 Bundler 管理依赖项
管理 Rails 应用程序的所有依赖项长期以来一直是一个拼凑而成的麻烦。我们有 config.gem、Capistrano 外部依赖、自定义 rake 设置任务以及其他不完整的解决方案。
Bundler 将所有这些问题都解决了,并允许您指定应用程序依赖的库、框架和插件。所有 Rails 3 应用程序都附带一个 Gemfile 来控制这一切。在 Bundler 网站上了解更多信息。
默认开启 XSS 防护
互联网是一个危险的地方,Rails 3 默认会为您提供保护。我们已经有了用于表单签名的 CRSF 防护功能一段时间了,并且从一开始就有了 SQL 注入防护,但 Rails 3 现在还增加了 XSS 防护(感谢 Django 说服了我们)。
在 RailsCasts 的 XSS 视频和 Rails 3 入门:跨站脚本视频中了解更多信息。
告别编码问题
如果您经常浏览互联网,您很可能会遇到 � 字符。这个问题 非常普遍,它是由于混合使用不同编码的内容引起的。
在像 Rails 这样的系统中,内容来自数据库、模板、源文件以及用户。Ruby 1.9 为我们提供了消除这些问题的原始工具,结合 Rails 3,� 字符在 Rails 应用程序中应该成为过去。再也不会为用户从 Microsoft Word 粘贴的损坏数据而烦恼了!
Active Model:所有模型的验证、回调等
我们将许多常用的 Active Record 组件提取到了新的 Active Model 框架中。这允许像 Mongoid 这样的 ORM 使用 Active Record 的验证、回调、序列化和 i18n 支持。
此外,在重写 Action Controller 时,我们删除了所有直接引用 Active Record 的地方,定义了一个干净、简单的 API,ORM 可以实现。如果您使用符合 API 的 ORM(如 DataMapper、Sequel 或 Mongoid),您将能够使用 form_for、link_to 和 redirect_to 等功能,与这些 ORM 的对象一起使用,而无需进行任何额外工作。
官方插件 API
我们还重写了 Railties,其明确目标是为所有 Rails 框架(如 Active Record 和 Action Mailer)使用新的插件 API。这意味着像 DataMapper 和 RSpec 的 Rails 插件可以像内置的 Active Record 和 Test::Unit 支持一样,访问所有的集成。
新的 Railtie API 使得修改内置生成器、添加 rake 任务、配置默认 Rails 选项以及指定代码的运行时间(尽早或尽晚)成为可能。Rails 插件(如 Devise)在其插件的 Rails 3 版本中能够实现更好的集成。预计在接下来的几个月里,您会看到更多这样的改进。
重写内部结构
我们重写了 Action Pack 和 Railties 的内部结构,使其更加灵活且易于扩展。Rails 3 不再是单一的 monolithic ActionController::Base,而是公开了许多具有定义 API 的模块,您可以将它们混合搭配以创建适合您自己的专用控制器。Rails 中的 Action Mailer 和 Cells 项目都充分利用了这一新功能。
您还可以查看 Yehuda 的 这篇博客文章(去年的),了解新的架构如何通过利用 Rack 和 ActionController::Metal 轻松实现 Django 式的通用操作。
Rails 的生成器系统也得到了改进。每个生成器不再是了解所有 Rails 框架的 monolithic 生成器,而是调用一系列钩子,例如 :test_framework 和 :orm,插件可以为这些钩子注册处理程序。这意味着使用 rSpec、DataMapper 和 Haml 生成脚手架时,将生成一个针对这些插件定制的脚手架。
与 jQuery、rSpec 和 Data Mapper 的兼容性
重写的内部结构和新的插件 API 为 Rails 3 带来了对框架所有组件的真正兼容性。更喜欢 DataMapper 而不是 Active Record?没问题。想使用 jQuery 而不是 Prototype?尽管去吧。渴望使用 rSpec 而不是 test/unit 进行测试?没问题。
在 Rails 3 中,您可以“随心所欲”地使用它,而且从未如此简单。同时,我们做到了这一点,而没有让使用优秀的默认堆栈变得更加复杂。
文档
Rails 3 的开发周期很长,这可能导致一些不耐烦,但也让书籍和教程作者有时间跟上并做好准备。现在已经有大量优秀的 Rails 3 文档可供使用,更多内容也将很快推出。
《Agile Web Development with Rails 第 4 版》一书已接近完成,并且还有 更多书籍即将推出。查看所有 新指南、新的官方视频、新的 RailsCasts 以及 新的教程。查看最近的 文档来源汇总了解更多信息。
安装
gem install rails --version 3.0.0.
我们还有一个 Rails v3.0.0 标签和一个 3-0-stable 分支。
Rails 3.0 设计用于与 Ruby 1.8.7、Ruby 1.9.2 和 JRuby 1.5.2+ 配合使用。
致谢与下一步
我个人为这个版本感到无比自豪。我已经在 Rails 上工作了 7 年多,而我们今天拥有的框架质量简直令人惊叹。这仅仅是因为社区的共同努力,Rails 3 涌现了许多杰出的开发者,他们站出来帮助我们取得了有史以来最好的发布(眨眼)。非常感谢大家。
我们将继续通过稳定分支来开发 Rails 3.0 并进行修复和调整,而 Rails 3.1 已经在 master 分支上开始开发。
更新:我们正在以 Rails 3.0 的名义为 Charity:Water 筹集资金。请捐款,帮助我们在 Rails 社区的名义下为 5,000 人带来清洁水源。