will_paginate вложенный объект Rails

Я надеюсь, что я могу объяснить это правильно, на данный момент у меня есть модель, которая имеет следующую связь

class Tournament < ActiveRecord::Base
has_one :gallery, dependent: :destroy
has_many :gallery_images, :through => :gallery, dependent: :destroy
end

Я хотел бы разбить на страницы только gallery_images в отличие от самого турнира, но так как я получаю gallery_images как вложенный атрибут, я не уверен, как это сделать с помощью will_paginate

контроллер

def galleries
  @tournaments = Tournament.all
  #tried this
  @gallery_images = @tournaments.gallery_images.paginate(:page => params[:page], :per_page => 9)
end

Посмотреть

                 <% @tournaments.each do |t| %>
                    <div>
                        <div class="clear"></div>
                          <ul class="team-gallery">
                            <% t.gallery_images.each do |g| %>
                              <li>
                                <%= link_to image_tag(g.photo.url(:gallery_large)), g.photo.url(:gallery_large), class: 'clb-photo' %> 
                              </li>
                            <% end %>
                        </ul>
                     </div>

Как я могу разбить на страницы только t.gallery_images?

Любая помощь приветствуется

3 ответа

Решение

Вы уверены, что это рабочий код?

@gallery_images = @tournaments.gallery_images.paginate(:page => params[:page], :per_page => 9)

Ты звонишь gallery_imagesто, что кажется методом экземпляра в коллекции ActiveRecord, которая по сути является массивом. Это не сработает.

Я подозреваю, что вы хотите пройтись по турнирам и назвать пагинацию на изображениях каждого турнира.

<% @tournaments.each do |t| %>
  <%= will_paginate t.gallery_images.paginate(page: params[:page], per_page: 9) %>
<% end %>

Вы можете создать экземпляр метода на Tournament модель, чтобы избавить вас от записи всего этого каждый раз, когда вы хотите разбить изображения на турнирах.

class Tournament
  def paginated_images(page, per_page = 9)
    gallery_images.paginate(page: page, per_page: per_page)
  end
end

Тогда вы можете сделать это по вашему мнению:

<% @tournaments.each do |t| %>
  <% images = t.paginated_images(params[:page]) %>
  <% images.each do |image| %>
    <%= image_tag image %>
  <% end %>
  <%= will_paginate images %>
<% end %>

В вашем контроллере определите вспомогательный метод paginate_images

helper_method :paginate_images

def paginate_images tournament
  @images = tournament.gallery_images.paginate(:page => params[:page], :per_page => 9)
end

По вашему мнению

 <% @tournaments.each do |t| %>
        <div>
            <div class="clear"></div>
            <ul class="team-gallery">
                <% paginate_images(t) %>
                <% @images.each do |g| %>
                      <li>
                        <%= link_to image_tag(g.photo.url(:gallery_large)), g.photo.url(:gallery_large), class: 'clb-photo' %> 
                      </li>
                 <% end %>
            </ul>
        </div>
<% end %>

Перепробовав оба ответа, он не работал должным образом, все еще получая неопределенные методы, хотя оба ответа очень помогли, и решение пока что ниже.

Это работает до такой степени, что gallery_images разбиты на страницы, но я не буду делать некоторые твики, то, что у меня пока есть, отчасти уродливо в представлении, но создаст вспомогательный метод, чтобы изменить это

<% @tournaments.each do |t| %>
  <div>
    <div class="clear"></div>
      <ul class="team-gallery">
        <% images = t.gallery_images.paginate(:page => params[:page], :per_page => 9).each do |g| %>
         <li>
           <%= link_to image_tag(g.photo.url(:gallery_large)), g.photo.url(:gallery_large), class: 'clb-photo' %> 
         </li>
        <% end %>
      </ul>
       <%= will_paginate images %>
     </div>
Другие вопросы по тегам