Prawnto和Prawn:重用使用pdf.make_cell()创建的单元格

时间:2014-01-28 23:15:46

标签: ruby-on-rails prawn prawnto

我已经在我的Rails 4应用程序中成功实现了Prawn Prawnto_2。但是,我遇到了一些我无法找到答案的表格单元格的奇怪行为。

在我的实现中,我的应用程序可以创建一个多页PDF,每页包含一个大表。每个表具有相同的设计并包含类似的数据,因此具有相同的表格标题。

为了加快速度并保持DRY,我会创建一个标题行:

header = []
(0..6).each do |index|
    header << pdf.make_cell(:content => "Heading #{index}", :width => 140, :borders => [])]
end

然后,通过多次调用pdf.table(),我可以为我希望显示标题行的每个表重新使用该标题行:

4.times do |i|
    pdf.table([header] + more_rows)
    # the more_rows variable is an array containing additional rows to be shows beneath the header
end

通过上面的循环,我希望有四个表,每个表都有相同的顶行。然而,这是正确的,表格尺寸是愚蠢的。即,在后续表中忽略列宽,并且不考虑表宽度。第一个表是完美的,但第二个表和更好的表是屈服于这个问题。

我能够解决这个问题的唯一方法是每次创建表时创建标题行,这意味着需要大量的代码重复。它效果很好,但根本不干。

因此,在上面的示例中,为什么重用header会导致不同的列和表宽度?有没有更合适的方法来重用Prawn::Table::Cell对象?

1 个答案:

答案 0 :(得分:0)

我怀疑这是重用Cell对象是一个坏主意。它可能不是一个不可变对象,并根据正在发生的事情在渲染过程中修改自身。查看Cell类的实现,他们有一个内部属性@pdf,他们在moveand a few others上执行操作。因此,通过在文档的不同区域重用这些内容,您将获得奇怪的结果,因为事情是move'的次数超过它应该是。

将标题逻辑放入函数中,以便为每次调用创建新单元格,并且仍然可以使代码看起来相当干净。