2010 年 8 月 29 日,星期日

Rails 3.0:它已准备就绪!

由 David 发帖

Rails 3.0 已进行了两年的制作,所以今天我们很荣兴的宣布它终于面世了。我们召集了 1600 多位贡献者来共同让所有的一切变得更好、更快、更简洁,更美观。

这一代的 Rails 已经看到了数千次的提交,因此选择重点介绍的内容必定是困难且不完备的。不过,以下是 Rails 3 几个重大更新。

新的 ActiveRecord 查询引擎
Active Record 采用了 ARel 查询引擎,从而使作用域和查询变得更一致、更具可组合性。这使得在多次迭代中构建复杂查询变得更加容易。我们还延迟了查询的实际执行,直到需要时才执行。以下是一个简单的示例:

<pre style="font-size: 12px">users = User.where(:name => "david").limit(20) users = users.where("age > 29")</p>

  1. SELECT * FROM users
  2. WHERE name = “david” AND age > 29
  3. ORDER BY name
  4. LIMIT 20
    users.order(:name).each { |user| puts user.name }</pre></code>

请阅读 有关 ActiveRecord 的新指南,并观看 深入了解 Rails 3:ARel 视频

Action Controller 的新路由
当我们为 Rails 2 中的控制器切换到基于 REST 的方法时,我们对现有路由程序打上了补丁,同时我们一直在等待看到这个实验是否如期进行。

它确实成功了,现在在 Rails 3 中,我们已经重新调整了语法,完全采用 REST 样式,以减少噪音并提高灵活性

<pre style="font-size: 12px">resources :people do resource :avatar</p> collection do get :winners, :losers end

end

  1. /sd34fgh/rooms
    scope ‘:token’, :token => /\w{5,5}/ do
    resources :rooms
    end
  1. /descriptions
  2. /pl/descriptions
  3. /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">类 Notifier < ActionMailer::Base 默认为 :from => "Highrise <system@#{APPLICATION_DOMAIN}>"</p> def new_project(digest, project, person) @digest, @project, @person = digest, project, person 附件['digest.pdf'] = digest.to_pdf 附件['logo.jpg'] = File.read(project.logo_path) 发送邮件( :主题 => “面向 #{project.name} 的摘要”, :收件人 => person.email_address_with_name ) do |format| format.text { 呈现 :text => “文本类型” } format.html { 呈现 :text => “文本类型” } 结束 end end

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,它使我们信服)。

查看 Railscast 上的 XSS 视频深入 Rails 3:跨网站脚本视频 以获取更多信息。

告别编码问题
如果你频繁浏览互联网,会常常遇到字符 &#xFFFD;。此问题普遍存在,它是由使用不同编码的内容互相组合而造成的。

在 Rails 这样的系统中,内容来自数据库、模板、源文件以及用户。Ruby 1.9 为我们提供了消除这些问题的基本工具,与 Rails 3 搭配使用后,&#xFFFD; 在 Rails 应用中应成为历史。从此再也不用为用户从 Microsoft Word 中粘贴损坏数据而苦苦挣扎了!

Active Model:针对所有模型的验证、回调等
我们已将相当一部分常见的 Active Record 组件提取至新的 Active Model 框架中。这使得类似 MongoidORM 能够使用 Active Record 的验证、回调序列化和 i18n 支持。

另外,在 Action Controller 重写中,我们移除了对 Active Record 的任何直接引用,定义了干净、简单的 API,ORM 可以实现此类 API。如果你使用符合 APIORM(例如 DataMapper、Sequel 或 Mongoid),你将能够将这些 ORM 中的对象与 form_for、link_to 和 redirect_to 等功能结合使用,而无需任何额外的工作。

官方插件 API
我们还重写了 Railties,其明确目标是将新的插件 API 用于所有 Rails 框架,例如 Active RecordAction Mailer。这意味着像 DataMapperRSpec 等插件,可以访问与内置 Active Record 和 Test::Unit 相同的所有集成。

新的 Railtie API 可以修改内置生成器,添加 rake 任务,配置默认 Rails 选项,并指定代码的运行时间(可以尽可能早或尽可能晚)。像 Devise 等 Rails 插件能够在插件的 Rails 3 版本中添加更好的集成。预计在未来几个月内将看到更多此类集成。

重写内部
我们重写了 Action Pack 和 Railties 的内部,使其更灵活、更易于扩展。Rails 3 并没有一个单一的整体 ActionController::Base,而是展示了许多模块(每个模块都有定义的 API),你可以混合搭配这些模块,以创建专用的控制器,供你自己的用途使用。Rails 中的 Action MailerCells 项目 都大量使用此新功能。

你还可以查阅 Yehuda 的这篇博文(去年发表),了解新架构如何让你能够借助 Rack 和 ActionController::Metal,在 Rails 中轻松实现 Django 风格的通用操作。

Rails 生成器系统也得到了改进。每个生成器都会调用一系列钩子(例如::test_framework 和 :orm),插件可以注册这些钩子的处理程序,而不再是知道所有 Rails 框架的整体生成器。这意味着在使用 rSpec、DataMapper 和 Haml 时生成脚手架,将生成针对这些插件定制的脚手架。

与 jQuery、RSpec 和数据映射无关
对于框架的所有组件,重写的内部和新插件 API 已经为 Rails 3 带来了真正的无关性。你更喜欢使用 DataMapper 而不是 Active Record?没问题。想要使用 jQuery 而不是 Prototype?没问题。渴望使用 rSpec 而不是 test/unit 进行测试?没问题

借助 Rails 3,定制变得比以往任何时候都更加容易。同时,我们做到了这一点,而且并没有让使用出色的默认堆栈变得更加复杂。

文档
Rails 3 的开发周期较长,虽然这难免会引起一些急躁情绪,但也给书籍和教程作者们以迎头赶上的机会。现在已经提供了非常棒的 Rails 3 文档,并且还会有更多文档很快提供。

使用 Rails 进行敏捷 Web 开发》(第 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 社区的的名义为 5000 人提供洁净水