Как можно ссылаться на скомпилированные ресурсы из контроллера в Rails 3.1? - PullRequest
20 голосов
/ 14 сентября 2011

Я использую 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")

Может кто-нибудь помочь?

Ответы [ 6 ]

31 голосов
/ 20 марта 2012

Rails.application.assets плохо документирован, но предоставляет доступ к хуку Rails в Sprockets, как объект 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, чтобы получить полный путь к файловой системе.

13 голосов
/ 07 октября 2011

view_context.asset_path 'application.css' должен сделать трюк.

8 голосов
/ 10 ноября 2014

Rails.application.assets['application.css'].pathname всегда возвращает исходный путь необработанного актива, а не предварительно скомпилированный файл, поэтому верхний ответ мне не помог.

Однако вызов to_s для связанного актива вместо *Кажется, что 1005 * правильно возвращает тело предварительно скомпилированного актива, поэтому вы можете просто использовать встроенный стиль вместо kit.stylesheets <<:

<style> <%= Rails.application.assets["application.css"].to_s %> </style>

4 голосов
/ 14 сентября 2011

Одним из решений является использование встроенного 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>
0 голосов
/ 27 сентября 2011

Лучший способ получить скомпилированное имя - из манифеста, который генерируется при компиляции.

Вы можете создать метод контроллера, который будет обслуживать необработанное имя в процессе разработки, а затем получить доступ к манифесту в рабочей среде для сопоставления правильного имени.

Местоположение манифеста по умолчанию:

File.join(Rails.public_path, config.assets.prefix, 'manifest.yml')

Но похоже, что вы можете получить к нему доступ в виде хэша в config.assets.digests

config.assets.digests[css_file_name_as_string]

0 голосов
/ 14 сентября 2011

Я думаю stylesheet_path ("application") - это то, что вы ищете

...