Как использовать гем Rails will_paginate для разделения большой таблицы для печати на одной странице

Я делаю несколько печатных таблиц для клиента с приложением Ruby on Rails 3.1, и мне нужно повторять заголовки таблиц на каждой странице. К сожалению, в настоящее время браузеры WebKit не поддерживают CSS решение на основе.

Чтобы решить эту проблему, я решил использовать гем will_paginate.

Контроллер

def
  @books = current_library.books.order('books.title ASC')
end

Текущий код просмотра

<% @books.each do |b| %>
<table>
  <thead><th><%= b.title %></th></thead>
  <tbody>  
  <% b.chapters.each do |chap| %
      <td><%= chap.number %> ... <%= chap.name %></td>
  <% end %>
  </tbody>
</table>
<% end %>

Как настроить страницы и пройти по каждой из них? Другими словами, как мне получить все страницы пагинации на одной странице просмотра?

В качестве альтернативы, есть ли лучший подход, который я должен использовать?


person JHo    schedule 29.05.2013    source источник


Ответы (1)


Возможно, вам лучше использовать Enumerable#each_slice здесь. Это позволяет вам разбить большой перечисляемый объект на серию меньших срезов, а затем выполнить итерацию по этим слайсам. Это довольно хорошо для такого рода вещей, не требует дополнительной математики в ваших циклах и не требует драгоценного камня.

Вот пример коллекции из 10 элементов на странице:

<% @books.each_slice(10) do |slice| %>
  <h1>Header Information</h1>
  <h2>Awesome</h2>

  <% slice.each do |book| %>
    <table>
      <thead><tr><th><%= book.title %></th></tr></thead>
      <tbody>  
      <% book.chapters.each do |chap| %
          <tr><td><%= chap.number %> ... <%= chap.name %></td></tr>
      <% end %>
      </tbody>
    </table>
  <% end %>

  <p>Some footer information</p>
<% end %>

Этот подход будет работать только в том случае, если вы предполагаете, что каждая запись книги занимает примерно одинаковое количество места (чтобы вы не получили слишком большие или маленькие страницы), но это также будет проблемой с will_paginate.

person XanderStrike    schedule 29.05.2013
comment
Спасибо. Я не знал, что .each_slice существует до сих пор. Проблема, которую я не знаю, как обойти, заключается в том, что когда я делаю .each_slice объект, это удаляет ассоциацию с активной записью. Чтобы уточнить, я надеюсь иметь n (например, 10) глав/строк в каждой таблице, поэтому мне действительно нужно что-то вроде <% book.chapters.each_slice do |chap| %> - person JHo; 30.05.2013
comment
Если это так, вам, возможно, придется просто увеличивать счетчик и проверять по модулю каждую строку. Возможно, есть более элегантное решение, но если оно и есть, то я о нем не знаю. - person XanderStrike; 30.05.2013
comment
Спасибо, КсандерСтрайк. Я использовал подход по модулю, и он отлично работает, но это не так. - person JHo; 01.06.2013