Ответ 1
Я нашел этот пост в блоге очень полезным: http://blog.seancarpenter.net/2012/11/05/page-specific-javascript-with-the-asset-pipeline/. Мой ответ перефразирует то, что написал этот блоггер, и заполняет несколько недостающих деталей.
Во-первых, важно, чтобы вы прочитали и поняли Руководство по Rails для конвейера активов. К сожалению, в этом руководстве нет четкого объяснения того, как добавлять активы, зависящие от конкретных действий, но он охватывает некоторые концепции, которые вам нужно знать. Удостоверились, что вы понимаете эти идеи:
- Что конвейер активов компилирует Javascript, CSS и другие активы, чтобы серверы Rails могли кэшировать активы для лучшей производительности.
- В файлах манифеста используются команды типа
require
,require_tree
иrequire_self
, чтобы указать, какие файлы скомпилированы вместе. - Чтобы для надлежащего функционирования конвейера активов в процессе производства вам нужно вручную запустить
rake assets:precompile
для создания скомпилированных, обобщенных активов в каталогеpublic
.
Эти идеи являются минимальными "необходимыми для изучения" сведениями о конвейере активов. Если вы еще не понимаете эти идеи, у вас нет уровня знаний "экспертов" или "энтузиастов" о конвейере, и, к сожалению, SO не подходит для изучения этого материала. К счастью, Rails Guide для Asset Pipeline - это короткое 15-минутное чтение, и вы можете быстро ускорить его, если вам это нужно.
Во-вторых, это изменения, которые необходимо внести, чтобы убедиться, что конвейер ресурсов правильно видит и обрабатывает ваш новый файл print.css
.
Выполните следующие действия:
- Добавьте ваш
print.css
файл вapp/assets/css
. - Вам нужно создать файл манифеста, в котором будет отображаться Rails, где можно найти
print.css
. Вам нужно сделать это, даже если у вас есть только один файл CSS, который вы добавляете. Это простой шаг:- Добавьте файл
print.js
вapp/assets/javascript
. - Добавьте эту строку в
print.js
:
- Добавьте файл
//= require print
Это будет единственная строка во всем файле print.js
. Если я правильно понимаю, Rails ожидает, что файлы манифеста будут иметь расширение файла .js
, поэтому мы не используем print.css
в качестве файла манифеста.
- Теперь нам нужно указать Rails, чтобы найти и использовать манифест
print.js
. Добавьте в свой файлconfig/application.rb
следующую строку:
config.assets.precompile += %w( print.js )
- Мы почти закончили! Однако уже существующий манифест
application.js
включает в себя строку//= require_tree .
, что означает, что он будет содержать ваш файлprint.css
. Это приведет к тому, что ваш стильprint.css
повлияет на весь ваш сайт, а не только на один вид. Есть два способа справиться с этим:- Если
application.js
иprint.js
не имеют общих ресурсов, вы можете использовать командуstub
вapplication.js
, чтобы исключить активы, используемые вprint.js
. Это дает указаниеapplication.js
удалить любое из активов, котороеprint.js
ссылается на собственный список ссылочных файлов. Наш измененныйapplication.js
выглядит так:
- Если
(snip...) require_tree . stub print
Подробнее см. этот ответ.
- Если ваши файлы
print.js
иapplication.js
разделяют некоторые активы, вам необходимо переместить все активы, используемыеapplication.js
в подкаталоги. Я не делал этого сам, поэтому я не очень помог в этой области. Посмотрите этот ответ для получения инструкций.
Теперь мы включили print.css
в конвейер активов. Теперь нам нужно направить Rails на использование print.css
в вашем конкретном представлении.
Скажем, ваше действие находится в контроллере reports
и что действие называется print_reports
. Это означает, что у нас есть файл reports_controller.rb
и файл print_reports.html.erb
(или .haml
). Мы должны внести несколько изменений в эти файлы.
- Чтобы начать, добавьте новый макет в
app/views/layouts
. Возможно, назовите егоprint.html.erb
. Мы будем использовать этот новый макет для вашего файлаprint_reports.html.erb
. Настройте его по своему усмотрению. Для страницы, предназначенной для печати, это, вероятно, будет очень просто, например
<html> <head> <title="Print"> </head> <body> <%= yield %> </body> </html>
Использование отдельного макета - недостаток, заключающийся в том, что трудно сохранить этот макет и макет, используемые остальной частью приложения, в синхронизации, но если вы используете отдельные файлы CSS для действия, маловероятно, что вы хотите, чтобы макет был все равно.
- Добавьте
stylesheet_link_tag
в заголовок макета, указав на вашprint.css
:
<html> <head> <title="Print"/> <%= stylesheet_link_tag "print" %> </head> <body> <%= yield %> </body> </html>
- В контроллере мы скажем Rails использовать наш новый макет для действия. Добавьте строку
layout 'print', only: [:print_reports]
к контроллеру:
class reports_controller < ApplicationController layout 'print', only: [:print_reports] #snip
См. этот вопрос для получения дополнительной информации и нескольких разных подходов.
В этот момент, когда вы запускаете приложение, ваше действие print_reports
должно корректно использовать print.css
!
Не забудьте запустить rake assets:precompile
перед развертыванием на сервере.