资产管道:仅对一个控制器使用javascript文件
在Ruby on Rails v4中,我想要仅为特定控制器加载js文件(或一组js文件)。
这样做的标准方法是什么?
在application.js中有//= require tree .
线。 我假设这需要删除所以我并不总是加载每个文件。 但那又怎样? 使用Mycontroller时是否总会加载名为mycontroller.js的文件?
如果你做得对,资产管道可以非常强大:
舱单
//= require tree .
的目的//= 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'