为什么Rails资产管道在子目录中无法实现惊喜?

时间:2013-12-11 09:12:30

标签: ruby-on-rails asset-pipeline

我正在使用Rails 3.2,并且对于子目录的处理和资产管道的相对路径感到有些困惑。

我的情况

我正在尝试在(javascripts/edit)中包含四个代码文件,其中一个代码文件位于清单文件(javascripts/edit/ckeditor)的子目录javascripts/edit/all.js中。我没有在application.js中包含这些内容,因为我想在某些页面上包含这些脚本

执行//= require ckeditor/ckeditor不起作用。执行//= require mycode(要求javascripts/edit/mycode.js)也不起作用,显然是因为mycode.js位于javascripts“root”文件夹的“edit”子目录中。为了使它工作,我不得不说:

//= require ./ckeditor/ckeditor
//= require ./json2
//= require ./cssjson
//= require ./mycode

在我的清单all.js内。请注意:

//= require edit/ckeditor/ckeditor
//= require edit/json2
//= require edit/cssjson
//= require edit/mycode

的工作方式完全相同,即使all.js本身已在edit子目录中。

所以我的问题是,为什么这样做?我希望能够将清单文件放在子目录中,只包括同一子目录中的文件(例如//= require json2),但显然,//= require下面任何文件中的所有app/assets/javascripts指令都是如此始终相对于“root”文件夹,而不是清单文件所在的子目录。

1 个答案:

答案 0 :(得分:2)

  

所以我的问题是,为什么这样做?

因为当Rails compiles the assets时,它是从中心点编译的,而不是你的子目录。清单系统基于资产的根路径(文档说The first feature of the pipeline is to concatenate assets)工作,因此您的资产将从application.js文件

编译

你必须记住Rails运行的时候,它没有动态加载资产。它旨在一直加载application.css / application.js,然后由开发人员委托他们希望加载到特定页面上的资产

我们这样做的方法是在application.js文件中包含所有“常量”文件,然后在布局中加载特定于控制器的资源。这允许我们只调用像JQuery这样的东西,而我们可以为某些控制器调用特定的JQuery插件:


在正确的地方包括合适的资产

这就是我们的工作:

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


#app/assets/javascripts/application.js
//= require jquery
//= require jquery_ujs
//= require jquery.ui.draggable
//= require_tree ./jquery
//= require_tree ./extra
//= require turbolinks

#app/assets/javascripts/users.js.erb
//= require ** anything you want **

这使您可以更好地控制正在加载的资产