在 Ruby on Rails v4 中,我希望仅为特定控制器加载一个 js 文件(或一组 js 文件)。
执行此操作的标准方法是什么?
在 application.js 中有//= require tree .
一行。我假设这需要删除,所以我并不总是加载每个文件。但是然后呢?使用 Mycontroller 时是否会始终加载名为 mycontroller.js 的文件?
在 Ruby on Rails v4 中,我希望仅为特定控制器加载一个 js 文件(或一组 js 文件)。
执行此操作的标准方法是什么?
在 application.js 中有//= require tree .
一行。我假设这需要删除,所以我并不总是加载每个文件。但是然后呢?使用 Mycontroller 时是否会始终加载名为 mycontroller.js 的文件?
如果操作正确,资产管道会非常强大:
清单
的目的//= require tree .
是创建一个“清单”文件,Rails 将使用该文件来呈现您调用的文件。如果您不“预编译”您的资产,这意味着每次您的浏览器加载您的应用程序时,它都会查找清单中包含的文件并加载它们
这意味着您可以定义清单中调用的内容和不调用的内容。我们更喜欢在清单中调用任何基于 gem 的资产,但也指定特定的文件夹,如下所示:
//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks
我们使用此设置来调用所有 JQuery 插件和任何额外的 JS,以及特定于 gem 的文件
预编译
如果您预编译资产,它基本上会构建不同的文件,这些文件在您加载浏览器时会一致加载。如果您使用 Heroku 或 CDN,您可能希望预编译您的资产,以减少延迟和依赖性
应用程序设计
要回答您的问题,您当然可以加载特定于控制器的 JS。我们这样做:
#app/views/layouts/application.html.erb
<%= stylesheet_link_tag "application", media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag "application", "data-turbolinks-track" => true %>
<%= stylesheet_link_tag controller_name, media: "all", "data-turbolinks-track" => true %>
<%= javascript_include_tag controller_name, "data-turbolinks-track" => true %>
然后,您可以使用 Phoet 描述的内容来确保您的 JS 文件被拆分:
#config/environments/production.rb
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile += %w(mycontroller.js)
那么对于 application.js,你只能调用你想要在整个应用程序中持久化的文件:
#app/assets/javascripts/application.js
//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks
它是这样工作的:
您定义应预编译的附加文件:
# Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)
config.assets.precompile += %w(mycontroller.js)
然后在你的布局中你实现一些逻辑来包含这个文件:
= javascript_include_tag "#{controller_name}.js" if controller_name == 'mycontroller'