我正在使用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”文件夹,而不是清单文件所在的子目录。
答案 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 **
这使您可以更好地控制正在加载的资产