为资产

时间:2016-09-07 06:32:07

标签: ruby-on-rails

对于我正在制作的Rails应用程序,我希望能够使用配置文件切换“主题”。主题不需要动态切换(在运行时,但在应用程序启动时将会知道)。

我将stylesheets目录从我的assets目录移到了名为/app/themes/[themename]/assets/stylesheets的文件夹中。

我们的想法是在/app/themes目录中有多个文件夹,供应用程序使用。

备注:我没有从资产文件夹中移动javascripts文件夹,因为我仍想全局使用它。

在我的布局中,我使用以下代码来加载控制器特定的样式表:

<%= stylesheet_link_tag "#{controller_name}" if MyApp::Application.assets.find_asset("#{controller_name}") %>

当然,我的应用程序不再知道我的资产在哪里,它为我提供了一个页面,资源没有加载(因为上面提到的if检查)。

我将以下代码添加到config/initializers/assets.rb,以确保它还加载主题目录中的资源:

Dir.glob("#{Rails.root}/app/themes/#{Settings.site.theme}/assets/**/").each do |path|
  Rails.application.config.assets.paths << path
end

Settings.site.theme是一个正确填充的字符串值,现在样式表实际加载到网站上。所以 YAY

但事情就是这样,我将config.assets.compile更改为false的那一刻,它都失败了(所以在测试和制作时)。

MyApp::Application.assets.find_asset("#{controller_name}")为nil:NilClass`抛出异常undefined method find_asset'。

我在Rails 5.0.0.1上。

任何人都知道如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我认为更简单的方法是在样式表下命名主题。也就是说,有一个像这样的文件夹结构:

- app
  - assets
    - stylesheets
      - theme-blue
        - application.scss
      - theme-red
        - application.scss
    - javascripts
      - application.js

然后,在您的布局文件中,您只需将stylesheet_link_tag指向theme-blue/application,就像这样:

<%= stylesheet_link_tag "theme-blue/application" %>

另一种方法是使用多个布局,一个用于theme-blue,另一个用于theme-red。在控制器中,执行

class BlueController < ApplicationController
  layout "theme_blue"
end

文件app/views/layouts/theme_blue.html.erb将需要正确的css文件。

您可能需要将scss文件添加到config/assets.rb,但Rails会告诉您是否需要它。