0

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

上記のループでは、4 つのテーブルがあり、それぞれが同じ一番上の行を持っていると予想されます。これは本当ですが、テーブルの寸法はばかげています。つまり、後続のテーブルでは列幅が無視され、テーブル幅は考慮されません。最初のテーブルは完璧ですが、2 番目以降はこの問題に屈します。

これを解決できた唯一の方法は、テーブルを作成するたびにヘッダー行を作成することでした。これは、多くのコードの重複を意味します。それはうまく機能しますが、DRYではありません。

headerでは、上記の例で、再利用によって列とテーブルの幅が変化するのはなぜでしょうか? Prawn::Table::Cellオブジェクトを再利用するより適切な方法はありますか?

4

1 に答える 1

0

ここでの私の疑いは、Cellオブジェクトを再利用するのは悪い考えだということです。これはおそらく不変オブジェクトではなく、何が起こっているかに基づいてレンダリング中に自身を変更します。クラスの実装を見ると、 、およびその他いくつかの操作を実行Cellする内部属性があります。したがって、ドキュメントのさまざまな領域でこれらを再利用すると、本来よりも多くの回数が実行されるため、奇妙な結果が得られます。@pdfmovemove

ヘッダー ロジックを関数に投入して、関数を呼び出すたびに新しいセルが作成されるようにします。これにより、コードを適度にきれいに保つことができます。

于 2014-01-28T23:23:14.373 に答える