2014-01-28 3 views
0

Я успешно применил Prawnto_2 с приложением Prawn in my Rails 4. Однако я столкнулся с каким-то странным поведением с ячейками таблицы, на которые я не мог найти ответа.Креветки и креветки: Повторное использование ячеек, созданных с помощью pdf.make_cell()

В моей реализации мое приложение может создавать многостраничный 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?

ответ

0

Мое подозрение здесь в том, что повторное использование объекта Cell - плохая идея. Это, вероятно, не неизменный объект и изменяет себя во время рендеринга, основываясь на том, что происходит. Рассматривая реализации класса Cell, они имеют внутренний атрибут @pdf, что они выполняют операции, move, and a few others. Таким образом, повторно используя их в разных областях документа, вы получите нечетные результаты, поскольку вещь move 'd больше времени, чем должно быть.

Бросьте логику заголовка в функцию, чтобы новые ячейки создавались для каждого вызова на нее, и вы все равно можете держать свой код выглядящим достаточно чистым.

+0

Я создал функцию внутри вспомогательного модуля, которая принимает объект 'pdf' в качестве аргумента, и теперь мой код DRY снова. –

 Смежные вопросы

  • Нет связанных вопросов^_^