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

位于 config/environments/development.rb 文件中的内容。除此之外,就这些更改而言,升级应该可以正常工作。

升级使用 RJS 的应用程序

现有使用 RJS 的应用程序应该可以与 prototype-rails 正常工作。

prototype-rails

RJS 已被提取到 prototype-rails 中。

在使用 Rails master(在 3.1 发布之前)的应用程序中,使用 RJS 的应用程序必须在 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 进行测试,并报告您发现的所有问题。谢谢!