Fer*_*one 3 ruby-on-rails wicked-pdf
我正在创建一个 API,它应该根据数据库上的一些信息生成一个 PDF。
尝试调用操作时出现错误:
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/v1/trips_controller.rb:56:in `print_monthly_trips'
Run Code Online (Sandbox Code Playgroud)
这是我的控制器:
/#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
Run Code Online (Sandbox Code Playgroud)
我的路线:
get 'print_monthly_trips', to: 'trips#print_monthly_trips'
Run Code Online (Sandbox Code Playgroud)
我使用以下命令调用我的 API:
http GET https://localhost/print_monthly_trips Accept:'application/vnd.trips.v1+json' Authorization:'my_token'
Run Code Online (Sandbox Code Playgroud)
那么,为什么我会得到这个:
ActionController::UnknownFormat (ActionController::UnknownFormat):
app/controllers/v1/trips_controller.rb:56:in`print_monthly_trips'
继承自的 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
Run Code Online (Sandbox Code Playgroud)
如果您不想ActionController::Base仅仅为了生成 PDF而承担实例化的开销,您可能需要对模板进行一些调整,并直接使用 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
Run Code Online (Sandbox Code Playgroud)
但是请注意,您将无法访问视图助手,并且大多数wicked_pdf_asset助手都无法通过这种方式访问。