Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用prawn生成pdf格式的表格_Ruby On Rails_Ruby_Ruby On Rails 5_Prawn - Fatal编程技术网

Ruby on rails 使用prawn生成pdf格式的表格

Ruby on rails 使用prawn生成pdf格式的表格,ruby-on-rails,ruby,ruby-on-rails-5,prawn,Ruby On Rails,Ruby,Ruby On Rails 5,Prawn,我已经在控制器内使用prawn pdf gem成功地生成了pdf文件,但是我想分离类文件并调用类的方法以使控制器代码看起来干净。 这是我的in-controller方法 def download_pdf if Subscriber.count<50 addSubscribers() else @subscribers=Subscriber.all.order("name ASC") end respond_to do |format| format.pdf do

我已经在控制器内使用prawn pdf gem成功地生成了pdf文件,但是我想分离类文件并调用类的方法以使控制器代码看起来干净。 这是我的in-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
而PdfCreator类是->

    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
类PdfCreator
def初始化(订阅服务器)
@subs=subscr
下载(pdf)
结束
def下载(pdf)
pdf=对虾::Document.new
表_data=Array.new
表_数据{:内联_格式=>true})
send_data pdf.render,文件名:'test.pdf',键入:'application/pdf',:disposition=>'inline'
结束
结束

响应不是作为方法解析的。我发现了一些关于从外部类生成pdf的代码,但只针对普通文本而不是表格-关于如何为表格生成pdf的任何帮助,这将是一个很大的帮助

发送数据
是一种控制器级方法,在自定义类中不起作用,您的路线可能需要
respond_to
,才能做出适当的响应

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

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
def下载\u pdf
@订阅者=订阅者.all.order(“名称ASC”)
回应待办事项|格式|
format.pdf do
pdf=PdfCreator.new(@subscribers)
发送数据pdf.render,文件名:'test.pdf',键入:'application/pdf',处置:'inline'
结束
结束
结束
类PdfCreator
def初始化(订阅服务器)
@subs=订阅者
结束
def render()
pdf=对虾::Document.new
表_data=Array.new
表_数据{inline_格式:true})
pdf.render
结束
结束

send\u data
是一种控制器级方法,在自定义类中不起作用,路由可能需要
respond\u to
才能正确响应

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

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
def下载\u pdf
@订阅者=订阅者.all.order(“名称ASC”)
回应待办事项|格式|
format.pdf do
pdf=PdfCreator.new(@subscribers)
发送数据pdf.render,文件名:'test.pdf',键入:'application/pdf',处置:'inline'
结束
结束
结束
类PdfCreator
def初始化(订阅服务器)
@subs=订阅者
结束
def render()
pdf=对虾::Document.new
表_data=Array.new
表_数据{inline_格式:true})
pdf.render
结束
结束

您的实际错误是什么?我要注意的一点是,
send\u data
将是该类中的一个问题,应该留在控制器中,但“代码显然是错误的”并不能真正帮助我们解决您可能遇到的任何其他问题。您的实际错误是什么?我要注意的一点是,
send_data
将是该类中的一个问题,应该留在控制器中,但“代码显然是错误的”并不能真正帮助我们解决您可能遇到的任何其他问题。我尝试了这段代码,结果显示无法加载pdfdocument@Achy97很抱歉。我只是在本地创建了原型,并意识到我错过了在
PdfCreator#render
中调用
pdf.render
。我编辑了它来解决这个问题。嗨,@Unixmonkey我今天遇到了一个我以前没有注意到的问题。pdf正在成功生成,但问题是当内容远远超过一页时-然后只有第一页有表头,但下面的OAGE没有表头。你能帮我解决这个问题吗?@Achy97我想你可以通过
header:true
table
选项,它会像这样重复:
pdf.table(table\u数据,宽度:500,单元格样式:{inline\u format:true},header:true)
hi,我尝试了这段代码,它显示加载pdf失败document@Achy97很抱歉。我只是在本地创建了原型,并意识到我错过了在
PdfCreator#render
中调用
pdf.render
。我编辑了它来解决这个问题。嗨,@Unixmonkey我今天遇到了一个我以前没有注意到的问题。pdf正在成功生成,但问题是当内容远远超过一页时-然后只有第一页有表头,但下面的OAGE没有表头。你能帮我解决这个问题吗?@Achy97我想你可以通过
header:true
table
选项,它将像这样重复:
pdf.table(table\u数据,宽度:500,单元格样式:{inline\u格式:true},header:true)