4

Kaminari を使用してページ付けしたいオブジェクトがいくつかあります。ただし、最初のページには、閲覧者が独自のオブジェクトを作成できるようにする通知も表示して、そのページに表示できるオブジェクトの数を減らしたいと考えています。ただし、指定されたページ数は、この最初のページに含まれる要素が少ないことも考慮に入れる必要があります。

オブジェクトが a から z までの文字であるとしましょう。最初のページには 4 文字のみを表示する必要があります: {a,b,c,d}、他のすべてのページには 6 文字を表示する必要があります。{e,f,g,h,i,j}, {k,l,m,n,o,p}, etc...

padding関数と関数を見てきましたがoffset、これらで必要な結果をまだ生成できていません。

@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) を表示しながら、のようなページネーションを取得するにはどうすればよいですか?

4

2 に答える 2

2

インターネットでさらに掘り下げた後、Ruby の方法を使用して手動で配列をページ付けする、配列のページ付けに関する「Kaminari レシピ」の興味深いセグメントを見つけました。instance_eval

私はこれを自分で使ってみinstance_evalましたが、かなりハックに見えますが、これはうまくいくようです

@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

他にもっと良い方法があると思いますが、今のところはこれでうまくいくようですので、そのままにしておきます。

于 2013-09-06T09:29:24.007 に答える
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 つのアイテムを返します。

于 2016-04-11T22:59:44.740 に答える