如何为Kaminari的第一页设置不同的页面大小?

时间:2013-08-28 13:31:28

标签: ruby-on-rails kaminari

我有很多想要使用Kaminari分页的对象。但是,在第一页上,我还想显示一个通知,允许查看者创建自己的对象,减少可以在该页面上显示的对象数量。但是,指定的页数还应考虑到第一页包含较少的元素。

假设对象是字母a到z。第一页只应显示4个字母:{a,b,c,d},而所有其他页面应显示6个字母:{e,f,g,h,i,j}, {k,l,m,n,o,p}, etc...

我一直关注paddingoffset函数,但我还没有用这些函数生成想要的结果。

@page是当前页面

if @page == 1
  Alphabet.page(@page).per(4)
else
  Alphabet.page(@page).per(6).padding(2)
end

=> {a,b,c,d},{i,j,k,l,m,n}, etc...

if @page == 1
  Alphabet.page(@page).per(4)
else
  Alphabet.page(@page).per(6).offset(4)
end

=> {a,b,c,d},{e,f,g,h,i,j}, {e,f,g,h,i,j} etc...
偏移方法也没有正确设置current_page,所以这似乎不是正确的方法。

如何在{1}}上显示分页,同时在第一页上显示正确的页数,在这种情况下为5?

2 个答案:

答案 0 :(得分:1)

在互联网上进行了一些挖掘之后,我在'Kaminari recipes'中发现了一个关于分页数组的有趣片段,它使用Ruby的instance_eval方法手动对数组进行分页。

我自己尝试使用这个instance_eval,似乎这似乎有用,虽然它看起来相当hacky

@page = (params[:page] || '1').to_i

if @page == 1
  @alphabet = Alphabet.recent.limit(4)
else
  @alphabet = Alphabet.recent.limit(6).offset(@page*6-8)
end

@alphabet.instance_eval <<-EVAL
  def current_page
    #{@page}
  end
  def total_pages
    ((Alphabet.all.count+2)/6.0).ceil
  end
EVAL

我确信有一些更好的方法,但由于现在这似乎是诀窍,我会保持原样。

答案 1 :(得分:1)

Buddy,我找到了使用padding

让它工作的方法
@page = (params[:page] || '1').to_i
@per_page = 4
if @page == "1"
  Alphabet.page(@page).per(@per_page - 1)
else
  Alphabet.page(@page).per(@per_page).padding(-1)
end

这样,第一页将返回3个项目,其他页面将返回4个项目。