【问题标题】:How to generate a PDF using wicked_pdf from an API如何使用 API 中的 wicked_pdf 生成 PDF
【发布时间】:2019-02-18 19:56:59
【问题描述】:

我正在创建一个 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'

【问题讨论】:

  • 第 56 行是哪一行?
  • respond_to do |format|
  • 导轨版本? Mime::Type注册的pdf数据类型?为什么要请求json 并返回 PDF?根据文档,您的布局看起来不对
  • 这只是一个测试。我的 Mime 类型是这样的: Mime::Type.register "application/pdf", :pdf
  • 即使我只放这个:respond_to do |format| format.xml { render(xml: "fdsfds") } format.json { render(json: "fdsfdsfd" ) } end 它的破坏方式相同

标签: ruby-on-rails wicked-pdf


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-02
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    相关资源
    最近更新 更多