Подтвердить что ты не робот

Как ссылаться на скомпилированные активы из контроллера в 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")

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

4b9b3361

Ответ 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]