Rails资产管道与主题

时间:2012-10-02 04:08:22

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

我有一个应用程序,允许用户为他们的页面选择一个主题。有几种不同的主题供他们选择。

每个页面的HTML结构与div上的相同类名完全相同。 CSS会有所不同以填写主题。当用户选择主题时,我将主题id存储在数据库中,并在访问页面时查询它,在application_layout.html.erb中加载相应的CSS文件:

<%= yield(:theme_style) %>

users_page.html.erb上,我抓住了相应的文件:

<%= provide(:theme_style, "theme_styles/#{@user.style.style_filename_file_name}") %>

由于页面结构没有变化,因此重要的是CSS文件不能在一个大的CSS文件中一起编译,否则最后一个主题将是唯一可用的,因为它将覆盖所有以前的样式。如何让Rails处理主题文件?

production.rb中,我有config.assets.precompile += ['theme_styles/basic.css', 'theme_styles/two-column.css'],但似乎并没有这样做,因为它告诉我它没有预编译。

我似乎无法在任何地方找到足够的信息让我朝着正确的方向前进,我查看了博客,SO问题和Rails文档。

1 个答案:

答案 0 :(得分:5)

我知道这是一个旧的,但我想我会回答我做了什么,以防它帮助其他人。我在我的应用程序中有类似的需求,并且在没有找到大量结果之后,在自定义选择器控制的一个css文件中使用它们时遇到IE最大数量的选择器错误,我最终走了让每个主题都在不同的路径通过创建如下所示的文件夹结构来创建CSS文件:

整体文件夹结构:

  • / app / assets / stylesheets /
  • /应用/资产/样式表/所有/
  • /应用/资产/样式表/主题-1 /
  • /应用/资产/样式表/主题-2 /
在app / assets / styleshseets中的

我把application.css.scss(如果你没有使用sass那么只是css) 这个文件有一个require self和我在所有网站上使用的一些mixins,但就是这样

 *= require_self

展望未来我有一个每个主题的css文件夹和一个所有文件夹,每个都有一个清单(清单放在main / stylesheets文件夹中)。它最终只是一个小小的工作来设置正确,但工作就像一个配置的魅力,没有更多的重叠或无关的css服务于具有不同主题的人,解决IE maximum selectors issues too

更多细节

所有共享css的所有文件夹

/应用/资产/样式表/所有/

所以把你正在使用的任何css文件放在那里的所有主题上。我把我的引导程序放在那里,但你可以把任何共享的CSS放在你想要的地方。那个的清单是......

 *= require_self
 *= require_tree ./all

然后你的主题,每个主题都有自己的文件夹:

/应用/资产/样式表/主题-1 /

显而易见:

   *= require_self
   *= require_tree ./theme-1

所以你的第二个主题是相同的(文件夹名称和清单中有2个而不是1个)。

使这些工作在资产管道中

在您的production.rb文件中添加以下内容

  config.assets.precompile += %w( application-all.css application-theme-1.css application-theme-2.css, etc.)

我将主题绑定到客户端站点并动态提供,这也允许我在运行时更改。在我的一个控制器(或应用程序,如果这是一个站点范围设置):

class MyController < ApplicationController
  layout :serve_layout
...
  def serve_layout
    #do what you need to call your layout / theme...    
  end

希望这有助于其他人坚持这艘船。