在Ruby on Rails v4中,我希望只为特定控制器加载一个js文件(或一组js文件)。
这样做的标准方法是什么?
在application.js中有//= require tree .
行。我假设这需要删除所以我并不总是加载每个文件。但那又怎样?使用Mycontroller时是否总会加载名为mycontroller.js的文件?
答案 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'