Неопределенный метод `page'для #<Array: 0xafd0660>

Я не могу пройти через это. Я знаю, что прочитал, что для массивов нет метода страниц, но что мне делать?

Если я запускаю Class.all в консоли, он возвращает #, но если я запускаю Class.all.page(1), я получаю вышеуказанную ошибку.

Есть идеи?

5 ответов

Решение

Нет Массив не имеет метода страницы.

Похоже, вы используете каминари. Class.all возвращает массив, поэтому вы не можете вызвать страницу на нем. Вместо этого используйте Class.page(1) напрямую.

Для обычных массивов у Kaminari есть отличный вспомогательный метод:

Kaminari.paginate_array([1, 2, 3]).page(2).per(1)

В Kaminari теперь есть метод разбиения на массивы, так что вы можете сделать что-то вроде этого в вашем контроллере:

myarray = Class.all
@results = Kaminari.paginate_array(myarray).page(params[:page])

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

NoMethodError at /
undefined method `page' for # Array

Там вам нужно напомнить себе о двух вещах: коллекция, которую вы хотите разбить на страницы, может быть массивом, ActiveRecordRelation или, конечно, чем-то другим.

Чтобы увидеть разницу, предположим, что наша модель это Product, и мы находимся внутри нашего действия с индексом на products_controller.rb. Мы можем создать наши @products с помощью, скажем, одного из следующих:

@products = Product.all

или же

@products = Product.where(title: 'title')

или что-то еще... и т. д.

В любом случае мы получаем ваши @products, но класс другой.

@products = Product.all
@products.class
=> Array

а также

@products = Product.where(title: 'title')
@products.class
=> Product::ActiveRecordRelation

Поэтому в зависимости от класса коллекции мы готовы разбить на страницы Kaminari:

@products = Product.where(title: 'title').page(page).per(per)
@products = Kaminari.paginate_array(Product.all).page(page).per(per)

Подводя итог, хороший способ добавить нумерацию страниц в вашу модель:

def index
  page = params[:page] || 1
  per  = params[:per]  || Product::PAGINATION_OPTIONS.first
  @products = Product.paginate_array(Product.all).page(page).per(per)

  respond_to do |format|
    format.html
  end

end

и внутри модели, которую вы хотите разбить на страницы (product.rb):

paginates_per 5
# Constants
PAGINATION_OPTIONS = [5, 10, 15, 20]

Я исправил проблему, вызвав крючки Каминари вручную. Добавьте эту строку для запуска в одном из ваших первых инициализаторов:

Kaminari::Hooks.init

Я разместил больше деталей в другом ответе:

неопределенная страница метода для ошибки # kaminari "page". rails_admin

У меня была такая же ошибка. Сделал обновление пакета, затем перезапустил сервер. Один из двух исправил это.

Другие вопросы по тегам