Неопределенный метод `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
Я разместил больше деталей в другом ответе:
неопределенная страница метода для ошибки #
У меня была такая же ошибка. Сделал обновление пакета, затем перезапустил сервер. Один из двух исправил это.