用大虾生成pdf中的table

Generate table in pdf with prawn

我已经在controller中使用prawn pdf gem成功生成了pdf文件,但是我想分离class个文件并调用class的方法制作controller代码看起来干净。 这是我的控制器内方法

  def download_pdf
if Subscriber.count<50
  addSubscribers()
else
  @subscribers=Subscriber.all.order("name ASC")
end
  respond_to do |format|
    format.pdf do
      pdf = Prawn::Document.new
      table_data = Array.new
      table_data << ["Name","E-mail","Phone"]
      @subscribers.each do |p|
        table_data << [p.name, p.email,p.phone]
      end
      pdf.table(table_data, :width => 500, :cell_style => { :inline_format => true })
      send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', :disposition => 'inline'
    end
  end

结束

但是当我尝试使用下面的代码时->

def download_pdf
  @subscribers=Subscriber.all.order("name ASC")
  PdfCreator.new(@subscribers)
end

而 PdfCreator class 是 ->

    class PdfCreator

  def initialize(subscribers)
    @subs=subscr
    download_pdf()
  end

  def download_pdf()
      pdf = Prawn::Document.new
      table_data = Array.new
      table_data << ["Name","E-mail","Phone"]
      @subs.each do |p|
        table_data << [p.name, p.email,p.phone]
      end
      pdf.table(table_data, :width => 500, :cell_style => { :inline_format => true })
    send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', :disposition => 'inline'
  end

end

响应不是作为一种方法进行解析。我找到了一些关于从外部生成 pdf 的代码 class 但仅适用于普通文本而不适用于表格 - 有关如何为表格执行此操作的任何帮助,这将是一个很大的帮助

send_data 是控制器级别的方法,不会在您的自定义 class 中工作,您的路由可能需要 respond_to 才能做出适当的响应。

让我们尝试保留控制器中需要的内容,并仅将 PDF 生成逻辑提取到新的 PdfCreator class:

def download_pdf
  @subscribers=Subscriber.all.order("name ASC")

  respond_to do |format|
    format.pdf do
      pdf = PdfCreator.new(@subscribers)
      send_data pdf.render, filename: 'test.pdf', type: 'application/pdf', disposition: 'inline'
    end
  end
end


class PdfCreator
  def initialize(subscribers)
    @subs=subscribers
  end

  def render()
    pdf = Prawn::Document.new
    table_data = Array.new
    table_data << ["Name","E-mail","Phone"]
    @subs.each do |p|
      table_data << [p.name, p.email,p.phone]
    end
    pdf.table(table_data, :width => 500, :cell_style => { inline_format: true })
    pdf.render
  end
end