如何通过API使用wicked_pdf生成PDF

时间:2019-02-18 19:56:59

标签: ruby-on-rails wicked-pdf

我正在创建一个API,该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 :(得分:2)

ActionController::API继承的Rails控制器不具备render视图或使用视图助手的能力,这对于许多WickedPdf用例来说是必需的。

您可以将PDF创建动作移至另一个从ActionController::Base继承的非API Rails控制器,也可以像这样在您的动作中实例化一个:

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

如果您不希望仅为了生成PDF而实例化ActionController::Base的开销,则可能需要对模板进行一些调整,并使用ERB或Erubis直接构建HTML,如下所示:

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助手都是这种方式。