具有固定页面链接计数的Kaminari分页控制

时间:2012-11-15 10:27:51

标签: ruby-on-rails kaminari

我希望Kaminari能够通过分页控制显示固定计数的分页链接,例如每个导航页面上的10个链接。 Kaminari默认在第一页显示6个页面链接,当您继续浏览直到达到9个项目时,页面链接会继续增长。

我在这里展示的图片,当我第一次加载时,它总共会有5个链接。

enter image description here

当我继续浏览时,它会增长。

enter image description here

在您浏览第5个链接之前,它仅显示9个链接。

enter image description here

即使在使用Kaminari导航的开头或结尾,我如何始终保持链接数为10。我尝试过Kaminari config.window,但这不是我想要的。

3 个答案:

答案 0 :(得分:9)

你可以修补Kaminari的PaginatorPageProxy类。通过覆盖relevant_pagesinside_window?left_outer?right_outer?等方法,您可以控制何时在分页视图助手中显示页面链接。

要开始使用,请在名为config/initializers的{​​{1}}中创建一个新文件并粘贴以下代码:

kaminari.rb

它并不漂亮,但它完成了工作。如果您在视图中设置module Kaminari module Helpers class Paginator < Tag def relevant_pages(options) 1..options[:total_pages] end class PageProxy def inside_window? if @options[:current_page] <= @options[:window] @page <= (@options[:window] * 2) + 1 elsif (@options[:total_pages] - @options[:current_page].number) < @options[:window] @page >= (@options[:total_pages] - (@options[:window] * 2)) else (@options[:current_page] - @page).abs <= @options[:window] end end end end end end ,那么当前页面总共会显示10个链接和另一个window: 5

要了解详情,请查看源代码https://github.com/amatsuda/kaminari/blob/master/lib/kaminari/helpers/paginator.rb

答案 1 :(得分:1)

我无法得到上面的答案。我所做的是计算窗口大小并将其传递给我的分页部分。

控制器

  window = @items.current_page < 5 ? 5 - @items.current_page : 1
  render partial: 'pagination; locals: {items: @items, window: window}

_pagination.html.slim

.col-lg-6.pull-right
  ...
  = paginate items, remote: true, window: window
  ...

答案 2 :(得分:0)

使用自定义主题的人:

视图中(超薄文件):

...other code...
- each_side = 4 # in case want to show 10 pages
= paginate items, left: each_side * 2 + 1, right: each_side * 2 + 1, theme: 'your-theme'

在app / views / kaminari / your-theme / _paginator.html.slim中:

ruby:
  each_side = 4 # in case want to show 10 pages
  if current_page - each_side < 1
    top_page = 1
    bottom_page = top_page + each_side * 2 + 1 > total_pages ? total_pages : top_page + each_side * 2 + 1
  elsif current_page + each_side + 1 > total_pages
    bottom_page = total_pages
    top_page = bottom_page - each_side * 2 - 1 < 1 ? 1 : bottom_page - each_side * 2 - 1
  else
    top_page = current_page - each_side
    bottom_page = current_page + each_side + 1
  end

= paginator.render do
  nav.pagination
    ul.pagination-list
      # for rendering first_page link
      # == first_page_tag unless current_page.first?
      == prev_page_tag unless current_page.first?
      - each_page do |page|
        - if page <= bottom_page && page >= top_page
          == page_tag page
      == next_page_tag unless current_page.last?
      # for rendering last_page link
      # == last_page_tag unless current_page.last?