Как использовать специальные таблицы стилей контроллера в Rails 3.2.1?

Использование Rails 3.2.1


Я создал простой контроллер Home с помощью команды:

rails g controller Home index

И он создал новый контроллер и посмотрел на меня:

enter image description here

Обратите внимание, что есть две таблицы стилей, одно "приложение" и один "дом". Я не могу найти документацию для поддержки этого предположения, но я предполагаю, что вы добавляете стили, которые будут применяться только к представлениям "Главная" в файле Home.css.scss, правильно?

Итак, в качестве теста я добавил в некоторые глобальные стили Application.css.scss.erb и запустил приложение.

Стили применяются, как ожидалось.

Затем я добавил некоторые правила в файл Home.css.scss, и я посетил представление "Home/index", но стиль в этом файле не был присоединен ни как отдельная ссылка ссылки CSS, ни даже прилагается к одному файлу Application.css.scss. Это очень смущает меня, поскольку в комментариях говорится:

// 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

Я не думаю, что это работает (Home.css применяется только к действиям контроллера Home). Разные файлы предназначены только для разделения, чтобы было более четким описание правил CSS. Вы можете прочитать этот guide о конвейере активов. Я предполагаю, что вы изменили значение по умолчанию application.css.scss и удалили строку, импортирующую все файлы CSS из app/assets/stylesheets.

Ответ 2

Это может работать так, и Марек совершенно прав, ответ в руководстве. В введение в раздел 2.1:

Например, если вы создаете ProjectsController, Rails также добавит новый файл в app/assets/javascripts/projects.js.coffee, а другой - в app/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, соответствующий текущему имени контроллера.

Ответ 3

Я решил эту проблему с помощью простого решения. Я добавляю к 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;
}

Для небольших проектов я думаю, что это нормально.

Ответ 4

TL; ДР:

Игнорировать комментарий, это не сделал Сасс. Но поставьте: @import "*"; в файл application.css.scss, и он автоматически импортирует все файлы scss-контроллера.

Полное чтение:

Отказ от ответственности: это мое текущее понимание потока конвейера с помощью и без Sass.

Я думаю, что этот комментарий написан стандартным конвейером Rails Asset (звездочки), а не 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, то звездочки будут загружать файл css в файл application.css автоматически (если в этом файле есть строка *= require_tree . по умолчанию).

Когда вы используете Sass с файлом application.css.scss, Sass будет скомпилировать этот файл в файл application.css. (Я предполагаю, что он будет перезаписывать или иметь приоритет над любым файлом application.css, который у вас уже был).

Чтобы автоматически добавить ваш файл home.css.scss (и другие файлы контроллера), поместите эту строку в файл application.css.scss:

@import "*";

Для справки см. этот вопрос: Можно ли импортировать весь каталог в sass с помощью @import?