2011-01-28 76 views
1

我有點博客/維基應用程序,我希望主頁包含一個歡迎/着陸消息和5個最新的博客條目和分頁鏈接到較舊的條目。rails分頁 - 不同的per_page價值頁面1從後續頁面

是否有可能將5頁作爲分頁搜索結果的頁面返回,對於後續頁面返回15頁?我目前正在使用will_paginate。

回答

4

您可以使用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

+0

非常感謝。看起來不錯,但沒有時間在mo上查看。肯定會很棒,但會回來。 – mark 2011-02-01 19:53:23

0

我還沒有試過這個,但也許通過覆蓋後續頁面上的參數[: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 %> 
+2

喜karudzo並感謝您的回答。這種方法的問題是職位6-10永遠不會被看到。 – mark 2011-01-28 19:25:53

1

對我來說,這聽起來像你有兩個截然不同的意見,你試圖合併成一個:「歡迎」和「檔案」。將一頁分成兩份可能會更簡單:

  • 「歡迎」頁面顯示歡迎消息,最新的X帖子和「舊帖子」鏈接。
  • 「檔案」頁面,根據需要包含所有帖子,will_paginated。是的,前五個帖子也會出現在這裏,但這是檔案中的預期(可能是好的)。

只是一種不同的思考方式 - 希望它有幫助!

+0

嗨澤維爾。感謝您的回答,但在我的情況下,這種方法將無法工作。我真的不認爲他們是獨特的觀點;這種方法對博客來說相當典型。想象一下,最新的帖子在頭版上有更大的表示,比如說1-5和6-10的正常大小。然後在第二頁上,我會以相似的總頁面尺寸發送15個正常大小的文章。不過再次感謝這個想法。 – mark 2011-02-04 09:52:56

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)