资产管道:仅对一个控制器使用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'