您可以配置Rails以预编译目录下的所有文件

时间:2017-01-23 18:43:29

标签: ruby-on-rails ruby asset-pipeline

是的,有一百万个问题,询问如何为资产管道注册目录。但我的问题略有不同......

我正在构建一个基本的主题系统,文件结构将如下所示:

app/assets/skins/
             some_theme/
                 style.css.scss
                 fonts/
                    font1.woff
                    font2.woff
                 images/
                     whocares.png
             another_theme/
                 ...

如您所见,特定于主题的资产捆绑在它们自己的目录中。当我添加新主题时,我不希望它需要对配置进行任何修改。

我是否可以配置资产管道来搜索/预编译app/assets/skins/下的所有文件?

我想我在application.rb中需要这样的东西......

config.assets.paths << Rails.root.join('app', 'assets', 'skins', '**')

......但这不是它的工作原理。它是如何工作的?

1 个答案:

答案 0 :(得分:1)

要包含所有脚本:添加到app/assets/javascripts/application.js

//= require_tree ../skins

要包含所有样式:添加到app/assets/stylesheets/application.css

*= require_tree ../skins

或sass的等效语法(比使用注释更好):

@import '../skins/**/*'

要将所有其他资源添加到config/initializers/assets.rb

Dir.glob( Rails.root.join( 'app', 'assets', 'skins', '**' ) ).each do |path|
  Rails.application.config.assets.paths << path
end

要访问例如app/assets/skins/a_theme/skin.png,您可以使用视图帮助程序,如:

<%= image_tag 'skin.png' %>

在你的sass文件助手中,如:

background-image: image-url('skin.png')

字体资产也一样。

更新:只是为了清除一个点:Dir.glob如果2个图像在不同的路径中具有相同的名称,则只使用路径列表中的第一个