web-dev-qa-db-fra.com

Kaminari & Rails pagination - méthode non définie `current_page '

J'ai cherché et cherché, mais rien n'a résolu mon problème. Voici mon contrôleur:

def show
    @topic = Topic.find(params[:id])
    @topic.posts = @topic.posts.page(params[:page]).per(2) # 2 for debugging
end

Cela fonctionne très bien, car la vue du sujet est réduite à deux messages. Cependant, lorsque j'ajoute ceci à show.html.erb:

<%= paginate @topic.posts %>

Je reçois cette erreur:

undefined method `current_page' for #<ActiveRecord::Relation:0x69041c9b2d58>
31
time

Essayez avec:

def show
  @topic = Topic.find(params[:id])
  @posts = @topic.posts.page(params[:page]).per(2)
end

Puis:

<%= paginate @posts %>
47
Nicolas Garnil

Si vous obtenez des erreurs de pagination dans Kaminari comme

méthode non définie `total_pages '

ou

méthode non définie `current_page '

c'est probablement parce que la portée AR que vous avez passée dans paginate n'a pas fait appel à la méthode page.

Assurez-vous de toujours appeler page sur les étendues que vous allez transmettre à paginate!

Cela s'applique également si vous disposez d'un tableau que vous avez décoré à l'aide de Kaminari.paginate_array

Mauvais:

<% scope = Article.all    # You forgot to call page :(  %>
<%= paginate(scope)       # Undefined methods...        %>

Bien:

<% scope = Article.all.page(params[:page]) %>
<%= paginate(scope) %>

Ou avec un tableau non AR de votre choix ...

Mauvais:

<% data = Kaminari.paginate_array(my_array)   # You forgot to call page :(        %>
<%= paginate(data)                            # Undefined methods...     %>

Encore une fois, c'est bien:

<% data = Kaminari.paginate_array(my_array).page(params[:page]) %>
<%= paginate(data) %>
21
Darren Hicks

Il y a quelque temps, j'ai eu un petit problème avec kaminari que j'ai résolu en utilisant différents noms de variables pour chaque action.

Disons que dans l'action index vous appelez quelque chose comme:

def index
  @topic = Topic.all.page(params[:page])
end

La vue index fonctionne bien avec <%= paginate @topic %> cependant si vous voulez utiliser le même nom de variable dans n'importe quelle autre action, cela génère une erreur comme celle-ci.

def list
  # don't use @topic again. choose any other variable name here
  @topic_list = Topic.where(...).page(params[:page])
end

Cela a fonctionné pour moi.

S'il vous plaît, essayez.

3
Kleber S.