我有许多对象想使用 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...offset 方法也没有正确设置 current_page,所以这似乎不是正确的方法。

如何获得看起来像 {a,b,c,d}, {e,f,g,h,i,j}, {k,l,m,n,o,p}, etc... 的分页,同时在第一页上显示正确的页数,在本例中为 5?

最佳答案

在互联网上进行了更多的挖掘之后,我在 '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

我确信有一些更好的方法,但由于现在这似乎可以解决问题,我将保持原样。

10-07 20:27