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>