2011 年 4 月 21 日,星期四

jQuery:新的默认

发布者 fxn

在 Rails 3.1 中,jQuery 将成为默认 JavaScript 库。另外,已经抽取出 RJS。本篇博文解释了这对新应用程序的意义,以及升级现有应用程序时需要注意的事项。

新应用程序

从 Rails 3.1 开始

rails new my_app

会生成一个使用 jQuery 的应用程序。

生成器的 -j 选项可让你选择 PrototypeScriptaculous

rails new my_app -j prototype

不过,这样的应用程序还没有 RJS。从今往后,RJS 需要 prototype-rails,见下文。

升级不使用 RJS 的应用程序

不使用 RJS 的现有应用程序应移除对项目中 ActionView::Base.debug_rjs 的任何引用。通常这意味着删除

config.action_view.debug_rjs = true

中的内容。此外,只要涉及这些更改,升级都应开箱即用。

升级使用 RJS 的应用程序

使用 prototype-rails 的现有 RJS 应用程序应开箱即用。

prototype-rails

RJS 已抽取出到 prototype-rails

在 3.1 版本发布之前,针对 Rails master 版本工作的应用程序必须将其添加到它们的 Gemfile

gem 'prototype-rails', :git => 'git://github.com/rails/prototype-rails.git'

Rails 3.1 发布时,prototype-rails 将成为一个 gem。

prototype-rails 现在提供 RJS 模板处理程序;ActionView::Base.debug_rjs 配置标志;将块传递给 link_to_functionbutton_to_function 的能力;控制器和视图中的 render:update 选项;以及模块 ActionView::Helpers::PrototypeHelperActionView::Helpers::ScriptaculousHelper

抽取已尽可能地考虑了向后兼容性。考虑到此目标,所有内容都放回了原处,要么是通过重新打开类或模块,要么是通过 alias_method_chain(当重构涉及将方法的某些部分剪切出来时,例如对 render :update 的操作时)。

有一个例外:ActionView::Helpers::PrototypeHelperActionView::Helpers::ScriptaculousHelper 不再是 ActionView::Helpers 的祖先。现在,它们直接注入到 ActionView::BaseActionView::TestCase 中。

将模块 M 包含到类 C 时,该类将 M 的代理存储在它的祖先链中。包含之后,如果向 M 中添加方法,则 C 的实例会对它们做出响应。但是,如果将另一个模块 N 包含到 M 中,则 C 的祖先链不会更新。 C 的实例将不会对 N 的方法做出响应。尽管完全动态方法调度将把两种增强 M 的方式视为相等,但这正是它的工作方式(截至今天)。

prototype-rails 加载时,ActionView::Helpers 已被包含到 ActionView::BaseActionView::TestCase 中,所以我们需要将它们直接注入到需要它们的位置。标准用法很有效,但请考虑到,如果您在假定这些祖先的情况下重新打开了或使用了 ActionView::Helpers,则请记住该更改。

在发布之前,prototype-rails 将提供一种方法,通过该方法可以将 PrototypeScriptaculous 引入任何应用程序。

最后一个细节:xhr 测试帮助程序

xml_http_request/xhr 测试帮助程序是一个简单的便捷方法,用于将 X\_REQUESTED\_WITH 标头设置为“XMLHttpRequest”。如果测试请求没有 Accept 标头,则固定值

[Mime::JS, Mime::HTML, Mime::XML, 'text/xml', Mime::ALL].join(', ')

将用作默认值。

Prototype 呼叫中的 Accept 标头与该值相对应,但在 jQuery 中,它取决于 dataType 属性。此外,在其他 JavaScript 库中,Accept 标头的行为可能会有所不同。该怎么做默认值?

此方法已保留。特别是,如果您的应用程序使用 jQuery,则测试中的默认 Accept 头部将不同于 jQuery 发送的 Accept 头部。这是一些醋酸:Rails 鼓励您基于显式 format 参数来创建界面。因此,例如,最佳做法是提供 /users.json 端点,而不是根据 Accept 头部选择 JSON 表示形式的 /users 端点。

如果您迫切需要在测试中匹配 Accept 头部,则仍然可以传递它。您还可以轻松编写自己的便利测试帮助器,因为 XHR 请求只是 X\_REQUESTED\_WITH 头部与 /XMLHttpRequest/i 匹配的请求。

尝试一下!

如果您的应用程序使用 RJS,那么您应该使用 prototype-rails 在 master 中对此进行测试并报告您可能发现的任何问题将非常有帮助。感谢!