Подтвердить что ты не робот

Kaminari & Rails pagination - undefined метод `current_page '

Я искал и искал, но ничто не решило мою проблему. Здесь мой контроллер:

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

Это работает отлично, потому что представление темы сводится к двум сообщениям. Однако, когда я добавляю это в show.html.erb:

<%= paginate @topic.posts %>

Мне дана эта ошибка:

undefined method `current_page' for #<ActiveRecord::Relation:0x69041c9b2d58>
4b9b3361

Ответ 1

Попробуйте:

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

И затем:

<%= paginate @posts %>

Ответ 2

Если вы получаете ошибки разбивки на страницы в Каминари, например

undefined метод `total_pages '

или

undefined метод `current_page '

вероятно, из-за того, что область AR, с которой вы перешли в paginate, не вызывала на ней метод page.

Убедитесь, что вы всегда вызываете page в областях, через которые вы будете проходить, в paginate!

Это также имеет место, если у вас есть массив, который вы украсили, используя Kaminari.paginate_array

Плохо:

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

Хорошо:

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

Или с массивом не-AR вашего собственного...

Плохо:

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

Опять же, это хорошо:

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

Ответ 3

Некоторое время назад у меня была небольшая проблема с каминари, которую я решил, используя разные имена переменных для каждого действия.

Скажем, в действии index вы вызываете что-то вроде:

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

В представлении index отлично работает с <%= paginate @topic %>, однако, если вы хотите использовать одно и то же имя переменной в любом другом действии, оно вызывает такую ​​ошибку.

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

Это сработало для меня.

Пожалуйста, сделайте снимок.