Как создать PDF с помощью wicked_pdf из API - PullRequest
0 голосов
/ 18 февраля 2019

Я создаю API, который должен генерировать PDF на основе некоторой информации в базе данных.

При попытке вызвать действие я получаю сообщение об ошибке:

ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/v1/trips_controller.rb:56:in `print_monthly_trips'

Это мои контроллеры:

/#application_controller.rb
class ApplicationController < ActionController::API
  include Response
  include ExceptionHandler
  include Pundit
  include ActionController::MimeResponds

 /#trips_controler.rb
def print_monthly_trips

  @trips_to_print = current_user.trips_for_month(3)

  respond_to do |format|
    format.html
    format.pdf do
      render pdf: "file_name",
      template: "trips/report.html.erb",
      layout: 'pdf.html'
    end
    format.json do
      render pdf: "file_name",
      template: "trips/report.html.erb",
      layout: 'pdf.html'
    end
  end
end

Мои маршруты:

get 'print_monthly_trips', to: 'trips#print_monthly_trips'

Я вызываю свой API с помощью:

http GET https://localhost/print_monthly_trips Accept:'application/vnd.trips.v1+json' Authorization:'my_token'

Итак, почему я получаю это:

ActionController :: UnknownFormat (ActionController :: UnknownFormat):

app / controllers/v1/trips_controller.rb:56:in `print_monthly_trips '

1 Ответ

0 голосов
/ 20 февраля 2019

Контроллеры Rails, которые наследуются от ActionController::API, не имеют возможности render просмотра или использования помощников вида, что необходимо для многих WickedPdf вариантов использования.

Вы можете либо переместитьСоздайте действие PDF для другого не-API-контроллера Rails, который вместо этого наследует от ActionController::Base, или создайте его в своем действии следующим образом:

def print_monthly_trips
  pdf_html = ActionController::Base.new.render_to_string(template: 'trips/report.html.erb', layout: 'pdf.html')
  pdf = WickedPdf.new.pdf_from_string(pdf_html)
  send_data pdf, filename: 'file_name.pdf'
end

Если вы не хотите нести накладные расходы на создание экземпляра ActionController::Base просто для того, чтобы сгенерировать PDF, вам может потребоваться внести некоторые изменения в свой шаблон и создать HTML-код непосредственно с помощью ERB или Erubis, например:

def print_monthly_trips
  layout = Erubis::Eruby.new(File.read(Rails.root.join('app/views/layouts/pdf.html.erb')))
  body = Erubis::Eruby.new(File.read(Rails.root.join('app/views/trips/report.html.erb')))
  body_html = body.result(binding)
  pdf_html = layout.result(body: body_html) # replace `yield` in layout with `body`
  pdf = WickedPdf.new.pdf_from_string(pdf_html)
  send_data pdf, filename: 'file_name.pdf'
end

Но имейте в виду, что у вас не будет доступа кпросматривать помощников, и большинство wicked_pdf_asset помощников таким образом.

...