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>
- SELECT * FROM users
- WHERE name = “david” AND age > 29
- ORDER BY name
- 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
- /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">类 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:跨网站脚本视频 以获取更多信息。
告别编码问题
如果你频繁浏览互联网,会常常遇到字符 �。此问题普遍存在,它是由使用不同编码的内容互相组合而造成的。
在 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。如果你使用符合 API 的 ORM(例如 DataMapper、Sequel 或 Mongoid),你将能够将这些 ORM 中的对象与 form_for、link_to 和 redirect_to 等功能结合使用,而无需任何额外的工作。
官方插件 API
我们还重写了 Railties,其明确目标是将新的插件 API 用于所有 Rails 框架,例如 Active Record 和 Action Mailer。这意味着像 DataMapper 和 RSpec 等插件,可以访问与内置 Active Record 和 Test::Unit 相同的所有集成。
新的 Railtie API 可以修改内置生成器,添加 rake 任务,配置默认 Rails 选项,并指定代码的运行时间(可以尽可能早或尽可能晚)。像 Devise 等 Rails 插件能够在插件的 Rails 3 版本中添加更好的集成。预计在未来几个月内将看到更多此类集成。
重写内部
我们重写了 Action Pack 和 Railties 的内部,使其更灵活、更易于扩展。Rails 3 并没有一个单一的整体 ActionController::Base,而是展示了许多模块(每个模块都有定义的 API),你可以混合搭配这些模块,以创建专用的控制器,供你自己的用途使用。Rails 中的 Action Mailer 和 Cells 项目 都大量使用此新功能。
你还可以查阅 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 人提供洁净水。