2014-01-28 23 views
0

我已经在我的Rails 4应用程序中成功实现Prawnto_2 Prawn。然而,我遇到了一些我无法找到答案的表格单元格的奇怪行为。Prawnto and Prawn:重用使用pdf.make_cell创建的单元格

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

为了加快速度,并保持干燥,我将创建一个标题行:

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会导致不同的列宽和表宽?有没有更适当的方法来重用对象?

回答

0

我怀疑这里是重复使用Cell对象是一个坏主意。它可能不是一个不可变的对象,并根据正在发生的情况在渲染期间修改它自己。查看Cell类的实现,它们具有内部属性@pdf,它们在move,and a few others上执行操作。因此,通过在文档的不同区域重复使用这些内容,您会得到奇怪的结果,因为事情是move'd比应该多。

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

+0

我在helper模块中创建了一个接受'pdf'对象作为参数的函数,现在我的代码再次变为DRY。 –

相关问题