Как использовать специальные таблицы стилей контроллера в 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?