在 Rails 3.1 中,jQuery 将成为默认的 JavaScript 库。此外,RJS 已被提取出来。这篇博文将解释这对新应用程序意味着什么,以及在升级现有应用程序时需要注意什么。
从 Rails 3.1 开始
rails new my_app
会生成一个使用 jQuery 的应用程序。
生成器的 -j 选项允许您选择 Prototype 和 Scriptaculous 作为替代。
rails new my_app -j prototype
这样的应用程序目前还没有 RJS。从现在开始,RJS 需要 prototype-rails,请参见下文。
现有不使用 RJS 的应用程序应从项目中删除对 ActionView::Base.debug_rjs 的所有引用。通常这意味着删除
config.action_view.debug_rjs = true
位于 config/environments/development.rb 文件中的内容。除此之外,就这些更改而言,升级应该可以正常工作。
现有使用 RJS 的应用程序应该可以与 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_function 和 button_to_function 传递块的能力;render 的 :update 选项(在控制器和视图中);以及 ActionView::Helpers::PrototypeHelper 和 ActionView::Helpers::ScriptaculousHelper 模块。
提取已尽可能地考虑了向后兼容性。本着这一目标,所有内容都恢复到了原来的位置,通过重新打开类或模块,或者在重构涉及截断方法部分时使用 alias_method_chain,如 render :update 的情况。
有一个例外:ActionView::Helpers::PrototypeHelper 和 ActionView::Helpers::ScriptaculousHelper 不再是 ActionView::Helpers 的祖先。它们现在直接被注入到 ActionView::Base 和 ActionView::TestCase 中。
当您将模块 M 包含到类 C 中时,类会在其祖先链中存储一个指向 M 的代理。包含后,如果您向 M 添加方法,C 的实例将响应它们。但是,如果您将另一个模块 N 包含到 M 中,C 的祖先链不会更新。C 的实例将不会响应 N 的方法。尽管完整的动态方法分派会将这两种增强 M 的方式视为相等,但目前就是这样工作的。
当 prototype-rails 加载时,ActionView::Helpers 已经被包含到 ActionView::Base 和 ActionView::TestCase 中,所以我们需要将它们直接注入到需要的地方。标准用法即可正常工作,但请注意,如果您重新打开或使用了 ActionView::Helpers 并假设它们是祖先,则需要考虑这一更改。
在发布之前,prototype-rails 还将提供一种方法,将 Prototype 和 Scriptaculous 引入任何应用程序。
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 进行测试,并报告您发现的所有问题。谢谢!