Railsページネーション-per_page値のページ1と後続のページが異なる

pagination ruby-on-rails will-paginate
Railsページネーション-per_page値のページ1と後続のページが異なる

ホームページにウェルカム/ランディングメッセージ、5つの最新のブログエントリ、および古いエントリにリンクするページネーションを含めるブログ/ウィキアプリケーションがあります。

たとえば、ページ分割された検索結果のページ1として5ページ、後続のページに15ページを返すことは可能ですか? 現在、will_paginateを使用しています。

  1  3


ベストアンサー

`WillPaginate

Collection`を使用できます。これを使用できる例を次に示します。

def self.find_with_pagination(params = {})
  WillPaginate::Collection.create(params[:page].to_i < 1 ? 1 : params[:page], per_page_for_page(params[:page])) do |pager|
    # inject the result array into the paginated collection:
    pager.replace(find(:all, params.merge({:limit => pager.per_page, :offset => pager.offset)}))
    unless pager.total_entries
      # the pager didn't manage to guess the total count, do it manually
      pager.total_entries = self.count
    end
  end
end

def self.offset_for_page(page_number)
  page_number.to_i > 1 ? ((page_number.to_i - 2) * 15 + 5) : 0
end

def self.per_page_for_page(page_number)
  page_number.to_i > 1 ? 15 : 5
end

私はそれが役立つことを願っています、ここにドキュメントへのリンクがあります:http://rdoc.info/github/mislav/will_paginate/master/WillPaginate/Collection

4


私には、「ようこそ」と「アーカイブ」という2つの異なるビューを組み合わせて1つにしようとしているように思えます。 1ページを2つに分割する方が簡単かもしれません。

  • ようこそメッセージ、最新のXを表示する「ようこそ」ページ
    投稿、および「過去の投稿」へのリンク。

  • 「アーカイブ」ページには、すべての投稿があり、「will_paginate」として
    必要。 はい、最初の5つの投稿もここに表示されますが、それはアーカイブで予想される(そしておそらく良い)ものです。

物事について考えるためのちょうど別の方法-それが役立つことを願っています!

1


私はこれを試していませんが、おそらく後続のページでparams [:per_page]をオーバーライドすることで動作します。 何かのようなもの:

コントローラは次のようなものであるため:

 @posts = Post.paginate :page => params[:page], :per_page => 10, :include => [:posts], :conditions => ["post.user_id = ?", current_user.id], :order => "title,created_at"

ビューにはおそらく次のようなものが含まれている可能性があります。

<%= params[:page] == 1 ? will_paginate @posts : will_paginate @posts, :per_page => 15 %>

0


はい、答えは少し古いですが、Rails 4.2でのソリューションは少し異なりますので、ここで紹介します。

最初のページには10件、その他のページには12件の結果が必要です。

item.rb

def self.find_with_pagination(params = {}, filters = {})
  WillPaginate::Collection.create(params[:page].to_i < 1 ? 1 : params[:page], per_page_for_page(params[:page])) do |pager|
    result = Item.all.limit(pager.per_page).offset(offset_for_page(params[:page])).where(filters)
    pager.replace result
    unless pager.total_entries
      # the pager didn't manage to guess the total count, do it manually
      pager.total_entries = self.count
    end
  end
end

def self.offset_for_page(page_number)
  page_number.to_i > 1 ? ((page_number.to_i - 2) * 12 + 10) : 0
end

def self.per_page_for_page(page_number)
  page_number.to_i > 1 ? 12 : 10
end

your_super_controller.rb

@items = Item.find_with_pagination(params, @filters)

0


タイトルとURLをコピーしました