Rails 3.2使用不同的CSS页面进行控制器中的一些操作(不是整个控制器)

时间:2013-08-30 15:09:16

标签: css ruby-on-rails-3.2 sass stylesheet

以下是该方案:

我的大多数页面使用来自不同页面的CSS,根据默认的Rails编译成一个大的CSS文件,没问题。

但我在控制器中有几页actions,需要使用不同的CSS页面而不是其他页面。这些只是控制器中的3个动作,否则使用主要的默认编译CSS。

为了实现这一目标,我为需要单独页面的操作调用了特定的布局:

  format.html { render :layout => 'doghouse_template' }

这个doghouse_template的主要内容是:

  = stylesheet_link_tag "doghouse_page"

这在开发中可以正常工作,如果有必要,可以在运行中编译页面,但在生产中,我收到以下错误:

ActionView::Template::Error (doghouse_page.css isn't precompiled)

这是因为doghouse_page.css 单独编译,它被编译到主application.css文件中,所以当然,它不存在于{{1}中}文件夹。

我还应该指出public/assets实际上并不是一个CSS页面,而是 SCSS 所以我不能将它复制到doghouse.css而不编译某种类型。

我的问题是,这里有什么解决方案?

我不能将application.css文件用于这些,让我们称之为狗屋页面,因为它会使样式混乱,反之亦然。

我甚至尝试将文件放入application.rb:

public/assets

但没有什么区别。另一方面,如果我提出:

config.assets.precompile += %w( doghouse_page.css.scss )

由于bootstrap / _accordion.scss文件,我在预编译时出错,所以我不能这样做。

我在这里看到了非常相似的问题,但它们倾向于适用于为整个控制器使用不同的CSS而且它没有指定如何不将所有页面编译成一个。

请注意,我想要将所有CSS页面(表面上只是一个解决方案)分开,只是这个单独的页面。

感谢。

1 个答案:

答案 0 :(得分:1)

你应该能够这样做(注意,缺少.scss,即使doghouse_page.css.scss是你的文件):

config.assets.precompile += %w( doghouse_page.css )

如果可以的话,我会考虑这样做。它对我有用。将doghouse_page.css.scss移动到'extra'文件夹中。然后:

config.assets.precompile += %w( extras/*.css )

然后在你的app / views / layout / application ...文件中添加类到控制器和操作的body标签。以下是我在其中一个项目中使用的HAML版本。

%body{:class => ["c-#{controller_name}", "a-#{action_name}", I18n.locale]}

然后,调整doghouse_page.css.scss,使其在带有正确控制器/动作类的body标签下作为范围。

在我的情况下,我通常只想覆盖一些东西或添加一些东西并保留application.css.scss中的大部分内容。这可能不适合你,但如果确实如此,这是一种相当简洁的自定义单个页面/操作的方法。