2012-11-01 39 views
32

Ho una matrice @ level1 che assomiglia a questo:impaginare un array in Ruby con will_paginate

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

voglio applicare impaginazione su questo array tale pagina di visualizzazione di ciascuna solo poche righe alla volta. Ho provato questo:

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

Ma getta il seguente errore:

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

Come posso eseguire l'impaginazione su questo utilizzando will_paginate?

risposta

26

Certo, è possibile utilizzare WillPaginate::Collection per costruire l'impaginazione arbitraria tra le raccolte. Assumendo un array di nome values:

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

Si può quindi trattare @values proprio come qualsiasi altra collezione WillPaginate, tra cui passarlo al aiutante will_paginate vista.

+0

Questo funziona perfettamente se si dispone di una matrice di oggetti che rappresentano una pagina (e il conteggio totale) e si desidera utilizzare vari helper di visualizzazione di WillPaginate, ad esempio se è necessario ignorare ActiveRecord per motivi di prestazioni. –

+1

Ho provato questo approccio e ha avuto un successo a metà. Genera l'helper di visualizzazione 'will_paginate', ma l'array non è suddiviso: viene generato l'elenco completo. Qualcosa in particolare necessario nella visualizzazione? – Jerome

+1

@Jerome È necessario popolare l'array di valori con solo i valori per la pagina corrente. Quindi si passa in current_page/per_page/il numero totale di valori nell'intera collezione manualmente e si costruiscono gli helper di paginazione. –

76

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

Proprio require 'will_paginate/array' prima di provare e funzionano bene. Se fossi in me, direi che è config/initalizers/will_paginate_extensions.rb quindi è disponibile subito e da ogni luogo.

+2

Questa è una soluzione molto migliore. Grazie! –

+1

@NathanColgate Se devi usare molto, allora forse sì.Ma se vuoi usarlo in pochi posti, non inquinerei le classi standard con cose che non sono di loro competenza. Un 'PaginatedArray', che eredita da' Array' e ha questo metodo potrebbe essere il modo migliore. Ma vado con la soluzione di Chris. – iGEL

2

Questo è il mio esempio basato nella risposta di @ chris-liccio

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

Dato un allineamento collection in un progetto Rails

will_paginate ~>3.0.5 

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

restituisce l'impaginazione per i valori di matrice.

Non dimenticare require 'will_paginate/array' nella parte superiore del controller.

+1

Non penso che un array possa chiamare 'paginate'. Questo è l'errore che ottengo: 'NoMethodError: metodo non definito' paginate 'per # ' –