铁路资产管道和页面特定文件

时间:2012-05-10 22:52:16

标签: ruby-on-rails asset-pipeline

在我的rails 3.1应用程序中,我有为每个控制器中的每个操作加载的特定文件,例如用户#index requires和index.js以及index.css文件,而用户#show需要show.js和show.css文件等。

然而,当我运行rake资产:预编译时,所有内容都会变成一个大的application.css和application.js文件,并且它会让我的观点变得非常糟糕。有没有办法,除了做" config.assets.precompile + =%w(index.js show.css)"使用rake资产时避免这种行为的方法:预编译?我是否必须以不同的方式构建和命名我的文件?

2 个答案:

答案 0 :(得分:2)

我通过在CSS和JavaScript中应用适当的范围解决了这个问题。例如。我的布局文件的body标签以下列方式给出动态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%不好的做法。

答案 1 :(得分:0)

猜测我会说包含文件的顺序搞砸了。

你通常想要的是你的mamisfest中的任何样板代码,然后是你自己的站点范围的表,然后是动作表。

所以你的application.css可能如下所示:

/*
 *= require reset
 *= require formtastic
 *= require jquery-ui
 *= require formtastic_overrides
 *= require site
 *= require_tree . 
*/

另一件可能搞砸的事情是在相关文件中应用广泛的规则(例如p{color:green}),并期望只为该操作提供服务。

这不是管道的工作方式,如果您正在尝试实现这些目标,则需要为这些视图应用更具体的规则。

就个人而言,我不会使用所有这些生成的文件。我更喜欢把我的CSS放在几个文件中,所以我可以在(大多数)一个地方看到它。我发现更容易管理,但YMMV!