Конвейер ресурсов Rails 3.1 с PDFKit

Я использую PDFkit с рельсами 3.1. Раньше я мог использовать функцию render_to_string и создавать PDF-файл из этой строки. Затем я добавляю таблицы стилей следующим образом. Моя проблема в том, что я понятия не имею, как получить к ним доступ из конвейера активов. (Вот как я это сделал в rails 3.0)

html_string = render_to_string(:template => "/faxes/show.html.erb", :layout => 'trade_request')
kit = PDFKit.new(html_string, :page_size => 'Letter')
kit.stylesheets << "#{Rails.root.to_s}/public/stylesheets/trade_request.css"

Итак, мой вопрос о том, как мне получить прямой доступ с моего контроллера к моему файлу css через конвейер активов?

Я знаю, что могу использовать промежуточное программное обеспечение Rack с PDFkit для отображения PDF-файла в браузере, но в этом случае мне нужно отправить PDF-файл в стороннюю службу факсов.

Спасибо за вашу помощь.

Райан


person lundie    schedule 18.11.2011    source источник
comment
Возможный дубликат Как один ссылаться на скомпилированные ресурсы из контроллера в Rails 3.1?   -  person Nathan Hughes    schedule 09.08.2016


Ответы (6)


Только что столкнулся с этой проблемой, и я преодолел ее, не используя конвейер ресурсов, но напрямую обращаясь к файлу, как раньше в /public. Не знаю, каковы возможные минусы использования этого подхода.

Я предполагаю, что файлы LESS и SCSS не будут обрабатываться так, как если бы они были доступны через конвейер ресурсов.

      html = render_to_string(:layout => false , :action => 'documents/invoice.html.haml')
      kit = PDFKit.new(html, :encoding=>"UTF-8")
      kit.stylesheets << "#{Rails.root.to_s}/app/assets/stylesheets/pdf_styles.css"
      send_data(kit.to_pdf, :filename => "test_invoice", :type => 'application/pdf')
person Constant Meiring    schedule 22.05.2012
comment
Единственный минус, который я вижу, это то, что вы не можете использовать SASS/LESS, это должен быть простой CSS. - person Kris; 28.06.2013

Немного поздновато, но лучше поздно, чем никогда, а.

Я бы сделал это так:

found_asset = Rails.application.assets.find_asset( "trade_request.css" ).digest_path
kit.stylesheets << File.join( Rails.root, "public", "assets", found_asset )
person zenw0lf    schedule 26.09.2013
comment
еще Errno::ENOENT - No such file or directory. - person Rajesh Omanakuttan; 29.06.2015

В Rails 3.1.1 таблицы стилей записываются в /public/assets с отпечатком дайджеста и без него.

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

Однако есть одна загвоздка: если лист PDF не указан в манифесте CSS, вам придется добавить его в конфигурацию предварительной компиляции:

config.assets.precompile += ['trade_request.css']

Это говорит sprockets скомпилировать этот файл самостоятельно.

В качестве (лучшей) альтернативы посмотрите, работает ли хелпер assets_path в вашем коде. Это будет ссылаться на правильный файл в разработке и производстве.

person Richard Hulse    schedule 18.11.2011
comment
Спасибо за ответ. Я просто использую файл application.css, поэтому не думаю, что мне нужно беспокоиться о предварительной компиляции. Я считаю, что pdfkit запускает отдельный процесс, и поэтому, когда я ссылаюсь на путь без хэша в конце файла, он не может его найти. IE это работает: kit.stylesheets ‹‹ #{Rails.root.to_s}/public/assets/application-5c342d3a7328fd347c8ca581f6bdff60.css это не работает: kit.stylesheets ‹‹ #{Rails.root.to_s}/public/assets/application .css Есть ли способ получить правильный путь к файлу? Спасибо! - person lundie; 21.11.2011

В итоге я скопировал файл css в свой общедоступный каталог и сослался на него так же, как и раньше с rails 3. Для получения дополнительной информации ознакомьтесь с этим вопросом: Доступ к таблице стилей_link_tag из контроллера

person lundie    schedule 12.01.2012
comment
Удалось ли вам улучшить это решение? и использовать конвейер активов для создания PDF? - person Don Giulio; 20.01.2014

Я приземлился здесь, пытаясь решить эту проблему, и ни один из ответов, похоже, не решил проблему для меня. Я обнаружил, что принятый ответ этого сообщения о переполнении стека сработал для меня:

Как ссылаться на скомпилированные активы из контроллера в Rails 3.1?

С помощью этого метода я даже смог обслуживать файлы .css.erb.

person Barry    schedule 09.08.2016

Вы должны иметь доступ к таблице стилей, используя этот метод:

ActionController::Base.helpers.asset_path("trade_request.css")

Создание вашего кода:

html_string = render_to_string(:template => "/faxes/show.html.erb", :layout => 'trade_request') 
kit = PDFKit.new(html_string, :page_size => 'Letter') 
kit.stylesheets = ActionController::Base.helpers.asset_path("trade_request.css") 
person Paul Simpson    schedule 11.01.2012