【问题标题】:Rail Asset Pipeline and Page Specific Files铁路资产管道和页面特定文件
【发布时间】:2012-06-27 12:09:26
【问题描述】:
在我的 rails 3.1 应用程序中,我有要为每个控制器中的每个操作加载的特定文件,例如users#index 需要 index.js 和 index.css 文件,而 users#show 需要 show.js 和 show.css 文件等。
但是,当我运行 rake assets:precompile 时,所有内容都会被合并到一个大的 application.css 和 application.js 文件中,这让我的观点大打折扣。除了在使用 rake assets:precompile 时执行“config.assets.precompile += %w(index.js show.css)”方法来避免这种行为之外,还有其他方法吗?我必须以不同的方式组织和命名我的文件吗?
【问题讨论】:
标签:
ruby-on-rails
asset-pipeline
【解决方案1】:
我通过在我的 CSS 和 JavaScript 中应用适当的范围解决了这个问题。例如。我的布局文件的主体标签以下列方式被赋予一个动态 id:
<body id="<%= "#{params[:controller]}-#{params[:action]}" %>" data-controller=<%= params[:controller] %> data-action=<%= params[:action] %>>
在我的 users_index.css 文件中,该操作的范围和样式使用:
body#users-index { .. }
因此,我的 CSS 清单如下所示:
/*
*= require self
*= require jqueryUi
*= require_tree .
*/
对于 JavaScript,我执行以下操作:
APP = { init: function() { ... },
users = {
index: function() {
//jQuery bindings here;
},
show: function() {
//More jQuery bindings here for this action;
}
}
}
现在,当页面加载时,我执行以下操作:
(function() {
action = $("body").data("action");
controller = $("body").data("controller");
APP.init();
APP[controller][action]();
})();
有点变通办法,但我看到 Paul Irish 和他的伙伴们做 JavaScript 的事情,我看到 RailsCasts 的 Ryan Bates 做 CSS 方法,所以我想这不会是 100% 的错误做法。
【解决方案2】:
我猜我会说包含文件的顺序搞砸了。
您通常需要的是任何样板代码,首先是您的 mamisfest,然后是您自己的站点范围的工作表,最后是操作表。
所以您的 application.css 可能如下所示:
/*
*= require reset
*= require formtastic
*= require jquery-ui
*= require formtastic_overrides
*= require site
*= require_tree .
*/
另一件可能会搞砸的事情是在关联文件中应用广泛的规则(例如p{color:green}),并期望仅为该操作提供服务。
这不是管道的工作方式,如果这是您想要实现的目标,您需要为这些视图应用更具体的规则。
就我个人而言,我不会使用所有这些生成的文件。我更喜欢将我的 CSS 放在几个文件中,这样我就可以在(大部分)一个地方看到它。我发现这更容易管理,但 YMMV!