【问题标题】:How to set different page size for the first page in Kaminari?如何为 Kaminari 中的第一页设置不同的页面大小?
【发布时间】:2013-08-31 14:45:38
【问题描述】:

我有许多对象想使用 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?

【问题讨论】:

    标签: ruby-on-rails kaminari


    【解决方案1】:

    伙计,我找到了使用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 个项目。

    【讨论】:

    【解决方案2】:

    在互联网上进一步挖掘后,我在'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
    

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

    【讨论】:

      猜你喜欢
      • 2016-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多