2012-11-01 12 views
32

Ich habe ein Array @ ebenen1, die wie folgt aussieht:Paginieren ein Array in Ruby mit will_paginate

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

Ich möchte auf diesem Array Paginierung gelten solche jede Seite zeigt nur ein paar Zeilen auf einmal. Ich versuchte dies:

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

Aber es führt den folgenden Fehler:

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

Wie kann ich ausführen Paginierung auf diesem mit will_paginate?

Antwort

26

Sicher können Sie WillPaginate::Collection verwenden, um beliebige Paginierung über Sammlungen zu erstellen. Unter der Annahme eines Array values genannt:

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

Sie können dann behandeln @values wie jede andere WillPaginate Sammlung, darunter an die will_paginate View Helfer übergeben.

+0

Das funktioniert gut, wenn Sie ein Array von Objekten haben, die eine Seite (und die Gesamtzahl) darstellen und verschiedene WillPaginate-Ansichtshelfer verwenden möchten - zum Beispiel, wenn Sie ActiveRecord aus Performance-Gründen umgehen müssen. –

+1

Ich versuchte diesen Ansatz und war halb erfolgreich. Es generiert den Helper 'will_paginate' View, aber das Array ist nicht aufgeteilt: Die vollständige Liste wird generiert. Alles was in der Ansicht benötigt wird? – Jerome

+1

@Jerome Sie müssen das Array Werte nur mit den Werten für die aktuelle Seite füllen. Sie übergeben dann current_page/per_page/die Gesamtzahl der Werte in der gesamten Sammlung manuell und konstruiert die Paginierungshelfer. –

76

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

Nur require 'will_paginate/array', bevor Sie es versuchen und es wird gut funktionieren. Wenn ich es wäre, würde ich sagen, config/initalizers/will_paginate_extensions.rb, so dass es sofort und von überall verfügbar ist.

+2

Dies ist eine viel bessere Lösung. Vielen Dank! –

+1

@NathanColgate Wenn Sie viel verwenden müssen, dann vielleicht ja.Aber wenn Sie dies nur an wenigen Stellen verwenden möchten, würde ich die Standardklassen nicht mit Dingen belasten, die nicht in ihrer Verantwortung liegen. Ein 'PaginatedArray', das von' Array' erbt und diese Methode hat, könnte der bessere Weg sein. Aber ich werde mit Chris 'Lösung gehen. – iGEL

2

Dies ist mein Beispiel basierend auf der Antwort von @ chris-Litze

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

ein collection Array in einem Projekt Rails Bei

will_paginate ~>3.0.5 

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

gibt die Paginierung für die Array-Werte.

Vergessen Sie nicht require 'will_paginate/array' auf der Oberseite des Controllers.

+1

Ich glaube nicht, dass ein Array 'paginate' aufrufen kann. Dies ist der Fehler, den ich bekomme: 'NoMethodError: undefinierte Methode' paginate 'für # ' –

Verwandte Themen