2012-11-01 17 views
32

Mam tablicę @ level1 który wygląda następująco:Stronicowanie tablicę w języku Ruby z will_paginate

[[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4], ............] 

Chcę zastosować paginacji na tej tablicy tylko takie każda strona wyświetla kilka wierszy naraz. Próbowałem to:

@temp1 = @level1.paginate(:page => params[:page]) 

Ale to rzuca się następujący błąd:

undefined method `paginate' for [[3.0, 4, 2], [2.0, 48, 3], [2.1, 56, 4]]:Array 

Jak mogę wykonać podział na strony w tym z wykorzystaniem will_paginate?

Odpowiedz

26

Oczywiście można użyć funkcji WillPaginate::Collection do tworzenia dowolnych stronicowania w kolekcjach. Zakładając tablicę o nazwie values:

@values = WillPaginate::Collection.create(current_page, per_page, values.length) do |pager| 
    pager.replace values 
end 

Następnie można traktować @values jak każdy inny kolekcji WillPaginate, włącznie z przekazaniem go do will_paginate widzenia pomocnika.

+0

Działa to świetnie, jeśli masz tablicę obiektów reprezentujących jedną stronę (i całkowitą liczbę) i chcesz użyć różnych pomocników widoku WillPaginate - na przykład, jeśli chcesz pominąć ActiveRecord ze względu na wydajność. –

+1

Próbowałem tego podejścia i odniosłem połowę sukcesu. Generuje pomocnika widoku 'will_paginate', ale tablica nie jest podzielona: generowana jest pełna lista. Coś szczególnie potrzebnego w widoku? – Jerome

+1

@ Jerome Należy wypełnić tablicę wartości tylko wartościami bieżącej strony. Następnie przekazujesz bieżącą stronę/per_page/całkowitą liczbę wartości w całej kolekcji ręcznie i tworzy ona pomocników do podziału na strony. –

76

Zobacz https://github.com/mislav/will_paginate/blob/master/lib/will_paginate/array.rb

Wystarczy require 'will_paginate/array' zanim spróbujesz go i będzie działać dobrze. Gdyby to był ja, wstawiłbym to na przykład config/initalizers/will_paginate_extensions.rb, więc jest dostępny od razu i zewsząd.

+2

To znacznie lepsze rozwiązanie. Dzięki! –

+1

@NathanColgate Jeśli musisz dużo używać, to może tak.Ale jeśli chcesz użyć tego w kilku miejscach, nie zanieczyszczałbym klas standardowych rzeczami, które nie są ich obowiązkiem. "PaginatedArray", który dziedziczy po 'Array' i ma tę metodę, może być lepszym sposobem. Ale pójdę z rozwiązaniem Chrisa. – iGEL

2

To jest mój przykład oparty na odpowiedź od @ chris-Heald

products = %w(i love ruby on rails) 
@products = WillPaginate::Collection.create(params[:page], params[:per_page], products.length) do |pager| 
    pager.replace products[pager.offset, pager.per_page] 
end 
3

otrzymał collection tablica w projekcie Rails

will_paginate ~>3.0.5 

collection.paginate(page: params[:page], per_page: 10) 

zwraca paginacji dla wartości tablicy.

Nie zapomnij o require 'will_paginate/array' na górze kontrolera.

+1

Nie sądzę, aby tablica mogła wywoływać 'paginate'. Jest to błąd, który otrzymuję: 'NoMethodError: undefined metoda' paginate 'for # ' –