2013-08-28 44 views
3

我有一些對象我想用Kaminari分頁。但是,在第一頁上,我還想顯示一條通知,允許觀看者創建自己的對象,減少可以在該頁面上顯示的對象的數量。但是,指定頁數還應考慮到第一頁包含的元素較少。如何在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...
偏移方法也不正確設置CURRENT_PAGE,所以這似乎並不像正確的方法。

我怎樣才能得到看起來像{a,b,c,d}, {e,f,g,h,i,j}, {k,l,m,n,o,p}, etc...的分頁,同時在第一頁顯示正確的頁數,在這種情況下5?

回答

1

經過一些更多的挖掘在互聯網上,我發現'Kaminari recipes'關於分頁數組有趣的部分,它使用Ruby的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 

我敢肯定有一些更好的出路在那裏,但因爲這似乎做現在的技巧,我會保持原樣。

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項。

相關問題