ruby on rails require_self Как одна ссылка ссылается на скомпилированные ресурсы из контроллера в Rails 3.1?




sprockets-rails (5)

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

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

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


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

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

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

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

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

config.assets.digests[css_file_name_as_string]


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 чтобы получить полный путь к файловой системе.


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

Тем не менее, вызов to_s для связанного актива вместо pathname , по-видимому, правильно возвращает тело предварительно скомпилированного актива, поэтому вы можете просто использовать встроенный стиль вместо использования kit.stylesheets << :

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


Одно из решений заключается в том, чтобы использовать 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>






asset-pipeline