拿出你们的派对气球和滑稽的帽子吧,因为我们来了,宝贝。是的,先生,Rails 1.2 终于来了,尽显其辉煌。为了让一切就绪,我们花费的时间比最初预期的要长一些(即使是这样,我们也遇到了一个小小的波折,直接从 1.2.0 跳到了 1.2.1,在我们写这篇公告之前)。
所以希望这次等待是值得的。我开什么玩笑。当然是值得等待的。我们带来了 RESTful 风味,并鼓励面向资源的架构。我们认真对待 MIME 类型、HTTP 状态码以及同一资源的多种表示形式。当然,还有多字节安全的 UTF-8 处理带来的国际化魅力。
这只是一部分重点功能。除此之外,还有大量令人惊叹的改进。仅 Action Pack 的 CHANGELOG 就包含大约两百条条目。Active Record 在此基础上又增加了 170 多条。
这一切都归功于我们优秀而辉煌的社区的辛勤工作。来自世界各地的人们,无论贡献大小,都在为增添你的笑容而努力。这就是爱,各位。
一如既往,你可以通过 gem 来获取最新最好的版本
gem install rails —include-dependencies
… 或者如果你更愿意直接冻结版本,你可以
rake rails:freeze:edge TAG=rel_1-2-1
如果你选择 gem,请记住更改 config/environment.rb 中的版本绑定。否则,你仍然会绑定到之前使用的旧版本。
请注意,这是一个重大的升级。Rails 的一些主要组件被重写了(包括路由和自动加载)。我们已尽最大努力保持向后兼容。我们进行了多次发布候选版本测试,以帮助大家实现这一目标。
但这可能并不完美——毕竟,什么才算完美呢——所以最好在考虑部署之前,对你的应用程序进行全面彻底的测试。当然,你一直是个很棒的小测试员,所以只需要一个“rake”命令就能看到一切是否正常,对吧?
在介绍了这些激动人心的内容后,我将引导你重温 RC1 的发布说明,其中包含了新功能。这次重温只包含亮点。真正的粉丝会想仔细阅读 API 的 CHANGELOGs 本身。
对于其他人来说,当然还有一条更简单的途径,那就是拿起第二版的 Agile Web Development with Rails。这一版是专门为 1.2 版本编写的,比 CHANGELOGs 提供了更多详尽的指导。
因此,毫不奇怪,第二版在第一个印次中就售出了 15,000 册,仅用了三周时间。请放心,第二版应该已经有售。而要即时满足,没有什么比在 Pragmatic 书籍网站上购买 PDF+图书组合更棒的了。
REST 和一般的 HTTP 理念是 Rails 1.2 的明星。这些功能大部分最初是在我 RailsConf 主题演讲中向公众介绍的。观看那个演讲,以了解为什么 REST 对 Rails 如此重要。
然后开始思考你的应用程序如何变得更 RESTful。你如何将一个包含 15 个动作的控制器转化为 2-3 个新的控制器,每个控制器都拥抱单个资源并进行 CRUD 操作。这其中隐藏着最大的好处:一种清晰的控制器设计方法,它将减少实现者的复杂性,并使应用程序在整个 Web 中表现得更好。
为了帮助过渡,我们提供了一个脚手架生成器,它可以创建一个存根 CRUD 接口,就像原始的脚手架一样,但以 RESTful 的方式。你可以使用“script/generate scaffold_resource”来尝试它。如果这样单独运行,你将获得关于它如何工作以及它将创建什么的简要介绍。
将这一切联系在一起的唯一真正的 API 元素是新的 map.resources,它被用来替代 map.connect 来连接基于资源的控制器,以支持 HTTP 动词。然后,一旦你拥有了一个支持资源的控制器,你就可以使用我们支持动词模拟的链接 `link_to "Destroy", post_url(post), :method => :delete` 来链接。同样,运行资源脚手架生成器也能让你体会到这一切是如何工作的。
虽然 respond_to 自 Rails 1.1 就已存在,但在 1.2 中我们做了一个小的调整,这对该功能即时可用性产生了很大的影响。那就是 :format 的魔力。所有新应用程序都将有一个额外的默认路由:`map.connect ':controller/:action/:id.:format'`。安装此路由后,想象下面的例子
class WeblogController < ActionController::Base def index @posts = Post.find :all respond_to do |format| format.html format.xml { render :xml => @posts.to_xml } format.rss { render :action => “feed.rxml” } end end end
GET /weblog # 从浏览器返回 HTML Accept 头部 GET /weblog.xml # 返回 XML GET /weblog.rss # 返回 RSS
使用 Accept 头部来实现这一点不再是必需的。这使得一切都变得容易得多。你只需在 URL 后添加 .xml 就可以在浏览器中浏览你的 API。你不需要一个 before_filter 来查找新闻阅读器的线索,只需使用 .rss。所有这些都自动与页面和动作缓存一起工作。
当然,这种格式的优势与 map.resources 配合得更好,它能自动确保一切都能正常工作。资源脚手架生成器甚至包含了一个使用 format.xml 的示例,所以 /posts/5.xml 也会自动被连接起来。非常巧妙!
Unicode 来了!虽然 Rails 一直能够毫无问题地存储和显示 Unicode,但截断、反转或获取 UTF-8 字符串的确切长度会更复杂一些。你需要自己处理 KCODE,虽然很多人设法解决了这个问题,但它不像你期望的那么即插即用。
由于 Ruby 要到明年此时才能实现多字节感知,Rails 1.2 引入了 ActiveSupport::Multibyte 来处理 Unicode 字符串。在字符串上调用 `chars` 方法可以开始处理字符而不是字节。
想象一下字符串 '€2.99'。如果我们在字节级别操作它,很容易就会得到破碎的梦想
‘€2.99’[0,1] # => “\342” ‘€2.99’[0,2] # => “?” ‘€2.99’[0,3] # => “€”
€ 字符占用三个字节。所以你不仅无法轻松地进行字节操作,而且 String#first 和 TextHelper#truncate 过去也会出错。在旧时代,会发生这种情况
‘€2.99’.first # => ‘\342’ truncate(‘€2.99’, 2) # => ‘?’
使用 Rails 1.2,你当然会得到
‘€2.99’.first # => ‘€’ truncate(‘€2.99’, 2) # => ‘€2’
TextHelper#truncate/excerpt 和 String#at/from/to/first/last 自动执行 .chars 转换,但当你需要自己操作或显示长度时,请务必调用 .chars。例如
你写了 <%= @post.body.chars.length %> 个字符。
使用 Rails 1.2,我们假设你想开箱即用地处理 Unicode。因此,动作渲染的默认字符集也是 UTF-8(你可以使用 `ActionController::Base.default_charset=(encoding)` 设置其他字符集)。KCODE 也自动设置为 UTF-8。
观看屏幕录像。 (但请注意,手动设置 KCODE 已不再是必需的)
Unicode 的需求最大,但 Multibyte 准备好处理其他编码(例如 Shift-JIS),只要它们实现了。请为你在用的编码扩展 Multibyte。
感谢 Manfred Stienstra、Julian Tarkhanov、Thijs van der Vossen、Jan Behrens 和(其他人?)创建了这个库。
Action Pack 有了一个全新的 Routes 实现,它既更快也更安全,但它也更严格一些。分号和句点是分隔符,所以以前匹配 `/download/history.txt` 的 `/download/:file` 路由现在不再起作用了。使用 `:requirements => { :file => /.*/ }` 来匹配句点。
我们修复了一个允许 Ruby 标准库中的库在引用时被自动加载的 bug。以前,如果你只是引用 Pathname 常量,我们会自动加载 pathname.rb。现在不行了,你需要手动 `require 'pathname'`。
我们还改进了模块加载的处理,这意味着对 Accounting::Subscription 的引用会查找 app/models/accounting/subscription.rb。同时,这意味着仅仅引用 Subscription 不会去查找 app/models 任何子目录下的 subscription.rb。只会尝试 app/models/subscription.rb。如果你因为某种原因依赖于此,你仍然可以通过在 config/environment.rb 中添加 `config.load_paths` 来将其恢复。
为了更好地符合 HTML 规范,**Prototype 的 Ajax 表单不再序列化禁用的表单元素。** 如果你依赖于禁用字段的提交,请更新你的代码。
为了保持一致性,**Prototype 的 Element 和 Field 方法不再接受任意数量的参数。** 这意味着如果你在手写的 JavaScript 中使用 Element.toggle、Element.show、Element.hide、Field.clear 和 Field.present,你需要更新你的代码(Prototype 助手已更新为自动生成正确的内容)。
// if you have code that looks like this
Element.show('page', 'sidebar', 'content');
// you need to replace it with code like this
['page', 'sidebar', 'content'].each(Element.show);
所有电子邮件默认都是 MIME 版本 1.0,所以你需要更新你的邮件器单元测试:`@expected.mime_version = '1.0'`
自 Rails 1.0 起,我们一直保持稳定的、向后兼容的 API,因此你的应用程序可以迁移到新版本而无需大量工作。其中一些 API 现在感觉像是我们的 大学新生体重增加,所以我们要开始减肥以去除冗余。**Rails 1.2 弃用了一些功能,这些功能现在有了更好的替代方案,或者更适合作为插件。**
弃用不是威胁,而是承诺!这些功能将在 Rails 2.0 中完全消失。你仍然可以在 1.2 版本中使用它们,但每次都会收到警告:在你的测试结果和日志文件中查找难看的弃用警告。
让你的 1.0 时代的的代码享受现代风格。要开始,只需运行你的测试并处理警告。