在 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
中的内容。此外,只要涉及这些更改,升级都应开箱即用。
使用 prototype-rails
的现有 RJS 应用程序应开箱即用。
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_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 中对此进行测试并报告您可能发现的任何问题将非常有帮助。感谢!