2013-08-28 4 views
3

У меня есть несколько объектов, которые я хотел бы рисовать с помощью 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...
Метод смещения также не устанавливает current_page правильно, так что это не кажется правильным способом.

Как получить разбивку на страницы, которая выглядит как {a,b,c,d}, {e,f,g,h,i,j}, {k,l,m,n,o,p}, etc..., а также отображение правильного количества страниц на первой странице, в данном случае 5?

ответ

1

После того, как еще несколько копаний в Интернете, я нашел интересный сегмент в 'Kaminari recipes' о paginating массивах, которые использовали метод Ruby's 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 

Я уверен, что есть какой-то лучший путь там, но так как это, кажется, делает трюк пока, я оставлю это как есть.

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 пункта.

Смежные вопросы