Как ссылаться на скомпилированные активы из контроллера в Rails 3.1?
Я использую PDFkit в своем контроллере, чтобы создать серию PDF файлов, закрепить их, а затем отправить их пользователю.
Чтобы управлять стилями вывода, я указываю PDFKit, какие таблицы стилей используются во время создания контента. Мне нужно передать ссылку на файл файла CSS. Поскольку Rails теперь компилирует и переименовывает мои таблицы стилей, я не уверен, как ссылаться на скомпилированный ресурс CSS внутри моего контроллера.
Вот что я использовал:
InvoicesController < ApplicationController
def download
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << "#{Sass::Plugin.options[:css_location]}/application.css"
kit.to_file("#{file_date_string}.pdf")
# snip
end
end
Sass:: Plugin.options [: css_location] теперь возвращает неправильное местоположение, не говоря уже о том, что application.css больше не является допустимым именем файла. Я должен упомянуть, что у меня есть файл app/assets/application.css, который служит манифестом для моих файлов SCSS, и он корректно работает в моих представлениях с помощью метода stylesheet_link_tag().
В основном то, что я ищу, является эквивалентом контроллера asset_path(), чтобы сделать что-то вроде этого:
kit = PDFKit.new(render_to_string(:show, :layout => false))
kit.stylesheets << asset_path('application.css')
kit.to_file("#{file_date_string}.pdf")
Может ли кто-нибудь помочь?
Ответы
Ответ 1
Rails.application.assets
плохо документирован, но он обеспечивает доступ к Rails-крюку в Звездочки, как объект Sprockets::Environment
. Rails использует Sprockets, чтобы в основном запустить весь конвейер активов, и именно здесь вы должны подключаться к следующим вещам:
kit.stylesheets << Rails.application.assets['application.css'].pathname
https://github.com/sstephenson/sprockets говорит об этом:
Доступ к активам программно
Вы можете использовать метод find_asset
(с псевдонимом []
) для извлечения актива из среды Sprockets. Передайте ему логический путь, и вы получите экземпляр Sprockets::BundledAsset
назад:
environment['application.js']
# => #<Sprockets::BundledAsset ...>
Вызовите to_s
для получаемого актива для доступа к его содержимому, length
, чтобы получить длину в байтах, mtime
, чтобы запросить его последнее модифицированное время, и pathname
, чтобы получить полный путь к файловой системе.
Ответ 2
view_context.asset_path 'application.css'
должен сделать трюк.
Ответ 3
Rails.application.assets['application.css'].pathname
всегда возвращает исходный путь исходного ресурса, а не предварительно скомпилированный файл, поэтому верхний ответ не работал у меня.
Однако вызов to_s
в связанном активе вместо pathname
, кажется, правильно возвращает тело предварительно скомпилированного актива, поэтому вы можете просто использовать встроенный стиль вместо использования kit.stylesheets <<
:
<style>
<%= Rails.application.assets["application.css"].to_s %>
</style>
Ответ 4
Одним из решений является вытащить встроенный CSS в ваше представление.
В HAML это может выглядеть так:
%style
= Sass.compile(File.read(File.join(Rails.root, 'app', 'assets', 'stylesheets', 'sass', "application.scss")))
Или в ERB:
<style>
<%= Sass.compile(File.read(File.join(Rails.root, 'app', 'assets', 'stylesheets', 'sass', "application.scss"))) %>
</style>
Ответ 5
Лучший способ получить скомпилированное имя - из манифеста, который генерируется при компиляции.
Вы можете создать метод контроллера, который служит для сырого имени в разработке, а затем обращается к манифесту в процессе производства, чтобы отобразить правильное имя.
Расположение манифеста по умолчанию:
File.join(Rails.public_path, config.assets.prefix, 'manifest.yml')
Но похоже, что вы можете получить доступ к этому как хэш в config.assets.digests
config.assets.digests[css_file_name_as_string]
Ответ 6
Я думаю, stylesheet_path ( "application" ) - это то, что вы ищете