4

我有以下项目结构:

/app
/config
/db
...
/themes
  /default
    /assets
      /images
      /stylesheets
      /...
    /views
      /...
  /theme1
   /assets
     /...
   /views
     /...

默认情况下应使用“默认”主题:)。'theme1' - 应该覆盖任何,例如 logo.png 或 view (application.erb)。

它应该以这种方式工作:如果不存在,请尝试从“theme1”获取资产 - 从“默认”使用。

视图非常简单:

self.prepend_view_path ::ActionView::FileSystemResolver.new(theme_view_path_for(name))
self.prepend_view_path ::ActionView::FileSystemResolver.new(default_theme_path)

但我无法用资产解决它。

config.assets.paths << "#{Rails.root}/themes/default/assets/stylesheets"
config.assets.paths << "#{Rails.root}/themes/default/assets/images"
config.assets.paths << "#{Rails.root}/themes/default/assets/javascript"

这会像往常一样添加资产,例如可以使用 url 'assets/logo.png' 访问资产,但我需要一个前缀 - “assets/theme1/logo.png”。此外,如果“theme1”没有通过“assets/theme1/logo.png”url 覆盖 logo.png,则应该返回“默认”主题徽标。(类似于上面的视图)。

我已经尝试过themes_for_rails - 但它不适合,因为它们覆盖了整个资产结构(自己的服务控制器等)。

此外,能够挂钩资产解析会很棒,例如,当访问 logo1.png 时,应该可以使用我的控制器提供它并从数据库中返回它。

感谢您的任何建议,我会在完成后分享结果。

基里尔·萨雷金

4

1 回答 1

0

默认情况下,第一级的文件夹将被 Rails 中的 Sprocket 忽略。您可以在默认应用程序中验证这一点,您会看到编译后的文件缺少初始的 javascripts/images/ 或 stylesheets/ 文件夹。

对您来说更好的结构是:

/themes
  /stylesheets
    /default
    /theme1
  /images
    /default
    /theme1

然后像这样添加目录:

config.assets.paths << "#{Rails.root}/stylesheets"
config.assets.paths << "#{Rails.root}/images"

想要引用主题中的文件?

= image_tag("#{theme_name}/background.png")
= stylesheet_tag("#{theme_name}/application.css")

那应该行得通。

于 2013-01-08T18:08:55.723 回答