如何在 Rails 3.2.1 中使用控制器特定的样式表?

Posted

技术标签:

【中文标题】如何在 Rails 3.2.1 中使用控制器特定的样式表?【英文标题】:How do I use Controller specific stylesheets in Rails 3.2.1? 【发布时间】:2012-03-03 22:51:11 【问题描述】:

使用 Rails 3.2.1


我使用以下命令创建了一个名为 Home 的简单控制器:

rails g controller Home index

它为我创建了一个新的控制器和视图:

注意有两个样式表,一个“应用程序”和一个“主页”。我找不到任何文档来支持这个假设,但我猜你在 Home.css.scss 文件中放置了只会应用于“主页”视图的样式,对吗?

所以作为测试,我在 Application.css.scss.erb 中添加了一些全局样式并运行了应用程序。

按预期应用的样式。

接下来,我在 Home.css.scss 文件中添加了一些规则,并访问了“Home/index”视图,但该文件中的样式并未附加,既不是单独的 CSS 参考链接,也不是附加到单个 Application.css.scss 文件中。这让我很困惑,因为 cmets 说:

// Place all the styles related to the Home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

为什么 Home.css.scss 中编写的规则不适用于我的网站?

【问题讨论】:

【参考方案1】:

它可以这样工作,Marek 是非常正确的,答案在指南中。 在introduction to section 2.1:

例如,如果你生成一个ProjectsController,Rails 也会在app/assets/javascripts/projects.js.coffeeapp/assets/stylesheets/projects.css.scss 添加一个新文件。您应该将控制器特有的任何 JavaScript 或 CSS 放在它们各自的资产文件中,因为这些文件可以为这些控制器加载,例如 <%= javascript_include_tag params[:controller] %><%= stylesheet_link_tag params[:controller] %>

所以要将您的应用程序设置为加载特定于控制器的样式表:

首先,通过删除 application.css 清单中的任何额外要求来禁用所有样式表的默认加载。

通常你会看到这样的条目:

 *= require_tree .

如果你还想加载一些常用的 css 文件,你可以将它们移动到一个子目录并执行以下操作:

 *= require_tree ./common

其次,在应用程序的布局中添加建议的 stylesheet_link_tag 例如

<%= stylesheet_link_tag    "application", :media => "all" %>
<%= stylesheet_link_tag params[:controller] %>

在此示例中,我们首先加载应用程序 css 文件,然后加载与当前控制器名称匹配的任何 css 文件。

【讨论】:

【参考方案2】:

我用一个简单的解决方案解决了这个问题。我将控制器名称作为类添加到body,编辑views/layouts/application.html.slim

body class=controller.controller_name

views/layouts/application.html.erb:

<body class="<%= controller.controller_name%>">

然后在我的 css 中,我只使用 body.controller_name 作为 命名空间

/* example for /users/ */

body.users 
    color: #000;


body.users a 
    text-decoration: none;

对于小型项目,我认为这很好。

【讨论】:

这也是 Sam Ruby 在《Agile Development with Rails 4》一书中的首选答案。如果您使用 scss 只需将整个代码包装在控制器名称中,例如 .body /*Entire css code in here*/【参考方案3】:

我不认为它是这样工作的(Home.css 仅适用于 Home 控制器操作)。不同的文件只是为了分隔,以便更清楚地说明 CSS 规则描述的内容。您可以阅读有关资产管道的guide。我猜你更改了默认的application.css.scss 并删除了从app/assets/stylesheets 导入所有CSS 文件的行。

【讨论】:

是的,你是对的,我删除了*= require_tree,因为它导致了对 Sprocket 的循环依赖。我不知道这意味着什么,因为我是 Rails 新手,但删除它解决了这个问题。令人惊讶的是,我将其添加回来只是为了测试您的答案,现在它可以顺利运行。 :S 还是很困惑。【参考方案4】:

TL;DR:

忽略评论,它不是 Sass 制作的。但是放: @import "*"; 到你的 application.css.scss 文件中,它会自动导入所有控制器的 scss 文件。

完整阅读:

免责声明:这是我目前对使用和不使用 Sass 的资产管道流程的理解。

我认为这条评论是由标准 Rails 资产管道(链轮)编写的,而不是 Sass:

// Place all the styles related to the Home controller here.
// They will automatically be included in application.css.
// You can use Sass (SCSS) here: http://sass-lang.com/

标准管道将处理 scss 文件,但不假定 application.css.scss 文件。但是如果你用 Sass 创建这样一个文件,那么 Sass 会将它编译成 application.css 文件。

如果您使用普通的 Rails 资产管道,没有 Sass,那么 sprockets 会自动将 css 文件加载到 application.css 文件中(如果该文件中有默认的 *= require_tree . 行) .

当您使用 Sass 时,通过 application.css.scss 文件,Sass 会将此文件编译成 application.css 文件。 (我假设它会覆盖或优先于您已经拥有的任何 application.css 文件)。

要自动包含您的 home.css.scss 文件(和其他控制器文件),请将此行放入您的 application.css.scss 文件中:

@import "*";

作为参考,请参阅此问题: Is it possible to import a whole directory in sass using @import?

【讨论】:

以上是关于如何在 Rails 3.2.1 中使用控制器特定的样式表?的主要内容,如果未能解决你的问题,请参考以下文章

Rails - 如何覆盖设计SessionsController以在用户登录时执行特定任务?

使特定的 Rails 视图使用某种布局

Rails - 如何在索引控制器方法中使用额外字段渲染json

在 Rails 3 中为特定控制器重定向记录器输出

在 Rails 中使用 Devise 注销特定用户

Rails-覆盖在使用部分或特定控制器视图时的页面元素