will_paginate嵌套对象Rails

时间:2014-05-06 10:58:33

标签: ruby-on-rails ruby will-paginate

我希望我能正确解释这一点,目前我有一个具有以下关联的模型

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 个答案:

答案 0 :(得分:3)

你确定这是有效的代码吗?

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

您正在ActiveRecord集合上调用gallery_images,这似乎是一个实例方法,它实际上是一个数组。那不会起作用。

我怀疑你想要围绕比赛进行循环并在每场锦标赛的图像上调用分页。

<% @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 %>

答案 1 :(得分:1)

在您的控制器中定义辅助方法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 %>

答案 2 :(得分:0)

尝试了两个答案,并没有像预期的那样工作,仍然得到未定义的方法,虽然这两个答案都有很大的帮助,到目前为止解决方案已经低于......

它的工作原理是gallery_images是分页的,但不好做一些调整,到目前为止我在视图中有点ugyy但是会创建一个帮助方法来改变它

<% @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>