web-dev-qa-db-fra.com

Paginer un tableau en Ruby avec will_paginate

J'ai un tableau @ level1 qui ressemble à ceci:

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

Je souhaite appliquer la pagination à ce tableau, de telle sorte que chaque page n’affiche que quelques lignes à la fois. J'ai essayé ceci:

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

Mais cela génère l'erreur suivante: 

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

Comment puis-je effectuer une pagination à l'aide de will_paginate?

33
Pi Horse

Bien sûr, vous pouvez utiliser WillPaginate::Collection pour construire une pagination arbitraire entre les collections. En supposant un tableau appelé values:

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

Vous pouvez ensuite traiter @values comme toute autre collection WillPaginate, y compris en le transmettant à l’aide de vue will_paginate.

26
Chris Heald

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

Juste require 'will_paginate/array' avant de l'essayer et ça marchera très bien. Si c’était moi, je mettrais ça dans le config/initalizers/will_paginate_extensions.rb, donc c’est disponible tout de suite et de partout.

78
Philip Hallstrom

Étant donné un tableau collection dans un projet Rails

will_paginate ~>3.0.5

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

renvoie la pagination pour les valeurs du tableau.

Ne pas oublier require 'will_paginate/array' sur le contrôleur.

5
Francisco Quintero

Ceci est mon exemple basé sur la réponse de @ 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
2
Alberto Camargo

Je n'étais pas vraiment heureux avec les réponses fournies dans ce fil.

Je suis venu avec cette solution.

# app/lib/paged_array.rb

require 'will_paginate/array'

class PagedArray
  delegate_missing_to :@paged_collection

  def initialize(collection, page: 1, per_page: 20)
    @paged_collection = collection.paginate(
      page: page,
      per_page: per_page
    )
  end
end

Et vous pouvez l'utiliser comme ça:

superheroes = %w[spiderman batman superman ironman]

PagedArray.new(superheroes, page: 1, per_page: 2)

J'aime cette solution car elle est explicite et vous ne polluez pas vos classes standard.

Cela étant dit, vous êtes dépendant de Rails puisque j'utilise "delegate_missing_to".

0
Jeremie Ges