pagination рельсов - отличается значение per_page page 1 от последующих страниц - PullRequest
1 голос
/ 28 января 2011

У меня есть своеобразное приложение для блога / вики, где я бы хотел, чтобы на главной странице было сообщение с приветствием / посадкой, а также 5 самых последних записей в блоге и пагинация со ссылками на старые записи.

Можно ли, например, вернуть 5 страниц в качестве первой страницы результатов поиска по страницам и 15 для последующих страниц? В настоящее время я использую will_paginate.

Ответы [ 4 ]

4 голосов
/ 31 января 2011

Вы можете использовать WillPaginate::Collection, вот пример, который вы можете использовать для этого:

def self.find_with_pagination(params = {})
  WillPaginate::Collection.create(params[:page].to_i < 1 ? 1 : params[:page], per_page_for_page(params[:page])) do |pager|
    # inject the result array into the paginated collection:
    pager.replace(find(:all, params.merge({:limit => pager.per_page, :offset => pager.offset)}))
    unless pager.total_entries
      # the pager didn't manage to guess the total count, do it manually
      pager.total_entries = self.count
    end
  end
end

def self.offset_for_page(page_number)
  page_number.to_i > 1 ? ((page_number.to_i - 2) * 15 + 5) : 0
end

def self.per_page_for_page(page_number)
  page_number.to_i > 1 ? 15 : 5
end

Надеюсь, это поможет, вот ссылка на документ: http://rdoc.info/github/mislav/will_paginate/master/WillPaginate/Collection

1 голос
/ 03 февраля 2011

Мне кажется, что у вас есть два разных представления, которые вы пытаетесь объединить в одно: "Добро пожаловать" и "Архивы".Возможно, было бы проще просто разделить одну страницу на две:

  • Страница «Добро пожаловать», которая показывает приветственное сообщение, последние X сообщений и ссылку на «Старые сообщения».
  • Страница "Архивы", на которой есть все сообщения, will_paginate d по мере необходимости.Да, первые пять постов также будут отображаться здесь, но это ожидается (и, вероятно, хорошо) в архиве.

Просто другой способ думать о вещах - надеюсь, это поможет!

0 голосов
/ 02 августа 2015

Да, ответ немного устарел, но я дам здесь свое решение на Rails 4.2, потому что оно немного отличается.

Мне нужно 10 результатов на первой странице и 12 - на других.

item.rb

def self.find_with_pagination(params = {}, filters = {})
  WillPaginate::Collection.create(params[:page].to_i < 1 ? 1 : params[:page], per_page_for_page(params[:page])) do |pager|
    result = Item.all.limit(pager.per_page).offset(offset_for_page(params[:page])).where(filters)
    pager.replace result
    unless pager.total_entries
      # the pager didn't manage to guess the total count, do it manually
      pager.total_entries = self.count
    end
  end
end

def self.offset_for_page(page_number)
  page_number.to_i > 1 ? ((page_number.to_i - 2) * 12 + 10) : 0
end

def self.per_page_for_page(page_number)
  page_number.to_i > 1 ? 12 : 10
end

your_super_controller.rb

@items = Item.find_with_pagination(params, @filters)
0 голосов
/ 28 января 2011

Я не пробовал этого, но, возможно, переопределение параметров [: per_page] на последующих страницах будет работать. Что-то вроде:

Так как контроллер это что-то вроде:

 @posts = Post.paginate :page => params[:page], :per_page => 10, :include => [:posts], :conditions => ["post.user_id = ?", current_user.id], :order => "title,created_at"

вид может иметь что-то вроде этого:

<%= params[:page] == 1 ? will_paginate @posts : will_paginate @posts, :per_page => 15 %>
...