对于我正在制作的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上。
任何人都知道如何解决这个问题?
答案 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会告诉您是否需要它。