【问题标题】:Extending view to generate PDF returns error after upgrade to Rails 6.1升级到 Rails 6.1 后扩展视图生成 PDF 返回错误
【发布时间】:2020-12-31 14:56:30
【问题描述】:

直到最近我扩展了 Rails 视图以在服务对象中生成 PDF:

view = ActionView::Base.new(ActionController::Base.view_paths, {})
view.extend(ApplicationHelper)
view.extend(Rails.application.routes.url_helpers)

WickedPdf.new.pdf_from_string(
  view.render(
    pdf: pdf_title,
    template: template,
    locals: { timesheet: timesheet },
    print_media_type:  true,
    orientation:       'Portrait',
    page_size:         'A4'
  )
)

升级到 Rails 6.1 后,出现错误,因为这行发生了变化:

view = ActionView::Base.new(ActionController::Base.view_paths, {})

根据 Rails 源代码中的此提交,现在有第三个参数 controller 是必需的。 这个:

def initialize(lookup_context, assigns = {}, controller = nil)

改成这样:

def initialize(lookup_context, assigns, controller)

但我不确定在这种情况下controller 是什么以及我应该作为第三个参数提供什么,因为这都是从服务对象而不是控制器调用的。也只是添加一个nil 值作为第三个参数是行不通的,因为 PDF 在打开时是不可读的,所以我猜它不能正确扩展视图。

那么知道要提供什么值作为第三个参数吗?

【问题讨论】:

  • 如果你有控制器,我认为调用TimesheetsController.renderer.render(template:'timesheets/show) 会给你html,但如果没有控制器,调用ApplicationController.renderer.render 会工作吗?

标签: ruby-on-rails wicked-pdf


【解决方案1】:

如果您使用一个基本控制器来呈现,而不是视图,您可能能够获得您需要的 html。使用已经包含路由和视图助手的控制器也将减少手动扩展/包含它们的需要。

WickedPdf.new.pdf_from_string(
  ApplicationController.renderer.render(
    pdf: pdf_title,
    template: template,
    locals: { timesheet: timesheet },
    print_media_type:  true,
    orientation:       'Portrait',
    page_size:         'A4'
  )
)

【讨论】:

  • 谢谢,这确实有效,不再需要显式扩展视图
猜你喜欢
  • 2021-03-30
  • 1970-01-01
  • 2021-01-07
  • 2020-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
相关资源
最近更新 更多