资产管道:仅对一个控制器使用javascript文件

时间:2013-11-11 05:36:14

标签: ruby-on-rails ruby-on-rails-4 asset-pipeline

在Ruby on Rails v4中,我希望只为特定控制器加载一个js文件(或一组js文件)。

这样做的标准方法是什么?

在application.js中有//= require tree .行。我假设这需要删除所以我并不总是加载每个文件。但那又怎样?使用Mycontroller时是否总会加载名为mycontroller.js的文件?

2 个答案:

答案 0 :(得分:4)

如果你做得对,资产管道可以非常强大:

<强>舱单

//= require tree .的目的是创建一个“清单”文件,Rails将使用该文件呈现您调用的文件。如果您没有“预编译”您的资产,这意味着每次您的浏览器加载您的应用时,它都会查找您的清单中包含的文件。加载它们

这意味着您可以定义清单中所调用的内容。你不做什么。我们更喜欢在清单中调用任何基于gem的资产,但也指定特定的文件夹,如下所示:

//
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks

我们使用此设置调用所有JQuery插件&amp;任何额外的JS,以及特定于宝石的文件


<强>预编译

如果预先编译资产,它基本上会构建不同的文件,这些文件在加载浏览器时会一致地加载。如果您使用的是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

答案 1 :(得分:1)

它的工作原理如下:

您可以定义应预编译的其他文件:

# 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'