星期四,2006 年 11 月 23 日

Rails 1.2: 第 1 号候选版本

由 David 发帖

自 Rails 的上次重大版本发布引入 RJS、respond_to、及加载等等经过了将近八个月。现在也是时候介绍下我们在此期间打磨的最新一波的重大观点。

由于此版本是重大新版本,且自 1.1 版本以来我们得到了难以置信的大量更新,因此我们感到有必要证明新功能的实际情况尽可能好。因此,此候选版本会找出新功能中的任何回归或重大问题。

更新: Josh Susser 有更多 对于此版本对开发者意味着什么以及如何最好地提交新版本的错误报告的内容。

最新功能

但是首先,允许我简要概括一下您应该激动的地方。虽然这些新功能看起来可能没有 RJS 之类的直接魅力,但它们仍然代表着从这一天开始创建大量 Rails 应用程序的基础性转变。

REST 和资源

REST 和一般的 HTTP 欣赏是 Rails 1.2 的特点。这些功能的大部分最初是在我题为 RailsConf 关于该主题的主旨演讲 中向公众介绍的。理解这一主题以进入 REST 对 Rails 至关重要的思维模式。

然后开始思考如何使您的应用程序更符合 RESTful。您也可以如何将 15 个动作控制器转换为 2-3 个新控制器,每个控制器采用单个资源并用 CRUDing 爱护。这是隐藏的最大好处所在:一种清晰的控制器设计方法,它将减少实施者的复杂性,并导致在常规网络上表现得更好的应用程序。

为了帮助完成转换,我们提供了一个脚手架生成器,它将创建一个存根 CRUD 接口,就像原始脚手架,但以 RESTful 方式。您可以使用“script/generate scaffold_resource”试用它。左不带这样的参数,您将获得有关其工作原理和将创建的内容的简要介绍。

将所有这些联系在一起的唯一真正的 API 元素是新的 map.resources,它用于代替 map.connect 为基于资源的控制器提供 HTTP 动词。然后,一旦您拥有一个资源控制器,就可以使用我们的动词模拟链接 link_to "Destroy", post_url(post), :method => :delete 进行链接。同样,运行资源脚手架将使您了解其工作原理。

格式和 respond_to

尽管 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 # 从浏览器的 Accept 头返回 HTML GET /weblog.xml # 返回 XML GET /weblog.rss # 返回 RSS

不再需要使用 Accept 头来实现此操作。这带来了诸多便利。只需在 URL 中添加 .xml,即可在浏览器中浏览 API。无需使用 before_filter 查找新闻阅读器的线索,只需使用 .rss。它们都会自动搭配页面和动作缓存一起使用。

当然,这种格式化的优势与 map.resources 十分契合,后者会自动确保所有操作都能正常运行。资源生成器 Scaffold 甚至包含了一个使用 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 和(其他?)创建该库。

疑难问题

虽然我们已尽最大努力尽可能保持与 1.1.6 的向后兼容性,但若您以特定方式执行操作,仍有一些小的问题需要返工。

路由

Action Pack 对路由进行了全新的实施,既更快速又更安全,但它也更加严格。分号和句号是分隔符,因此,以前用于匹配/download/history.txt/download/:file路由现在无法再工作了。使用:requirements => { :file => /.*/ }来匹配句号。

自动加载

我们修复了一个错误,该错误会导致 Ruby 标准库中的库在引用时自动加载。以前,如果您仅仅引用 Pathname 常量,我们将自动加载 pathname.rb。现在,您需要手动require 'pathname'

我们还改进了模块加载的处理,这意味着对 Accounting::Subscription 的引用将查找 app/models/accounting/subscription.rb。同时,这意味着仅仅引用 Subscription 不会 在 app/models 的任何子目录中查找 subscription.rb。将只尝试 app/models/subscription.rb。如果您出于某种原因依赖此项功能,仍然可以通过在 config/environment.rb 中将 app/models/accounting 添加到 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);

Action Mailer

默认情况下,所有电子邮件都是MIME版本 1.0,因此您必须更新您的邮件器单元测试:@expected.mime_version = '1.0'

已弃用

自 Rails 1.0 以来,我们一直在为一个稳定的、向后兼容的 API 做努力,这样,您的应用无需花太多功夫便可以升级到新版本。现在,此 API 中的部分功能就像我们的 大一新生 15,而且我们正在节食以减脂。Rails 1.2 弃用了少数几个现在有更棒的备选项,或者更适合作为插件的功能。

弃用并不是一个威胁,而是一个承诺!这些功能会在 Rails 2.0 中彻底消失。您可以在 1.2 中继续使用它们,但您会每次都收到一个警告:查找测试结果和日志文件中难看的弃用警告。

为您的 1.0 时代代码添加一些现代风格吧。要开始,只需运行测试并处理好警告就行了。

安装

发行候选版本 gem 存在于 Rails gem 存储库中。您可以像这样安装它们

gem install rails —source http://gems.rubyonrails.org —include-dependencies

请注意,它会显示类似于“已成功安装 rails-1.1.6.5618”的内容。这是正确的,因为我们不会在官方发布之前使用最终版本号。

您还可以通过 http://dev.rubyonrails.org/svn/rails/tags/rel_1-2-0_RC1 从 Subversion 中直接获取它。

提交回归漏洞

您弄明白了。这些是主要更改,而且和往常一样,您可以在 CHANGELOG 中获得完整、详细的独家新闻。在过去八个月中,我们对数百个功能进行了改进。仔细阅读 CHANGELOG 以获得好处,非常值得。Ryan’s Scraps 正在 为更改添加注释,做得不错。

但是随着任何新软件的发布,许多之前能够正常工作的内容将不再能够工作。

虽然 Rails 1.2 的目的是提供无缝向后兼容性,但我们都只是人,有很大的可能会出现问题。那么,如果您在尝试 1.2 发行候选版本时发现了漏洞,务必向我们报告。在发行候选版本周期中,您应该遵循以下几个步骤帮助我们修复这个漏洞。

当添加您的漏洞报告时,务必在关键词字段中输入“1.2regression”。包含此关键词的漏洞会显示在 trac 报告 中,如果您希望找到一个提供帮助的地方,就在那里开始吧。

如果您能做到,请在您的漏洞报告中附上一个失败的单元测试。这会让我们轻松许多,并帮助其他人验证您确实发现了实际存在的案例。