Как заставить Kaminari всегда включать параметр страницы?

Генерация URL-адреса Kaminari исключает параметр страницы, если он возвращает ссылку на первую страницу. Тем не менее, приложение предназначено для выбора случайной страницы, если параметр страницы опущен. Таким образом, поведение по умолчанию Kaminari исключает возможность возврата страницы к первой странице надежным способом.

Я решил эту проблему и позже опубликую свое решение ниже, но я хотел бы опубликовать этот вопрос для потомков, и я также довольно новичок в Rails, поэтому я не уверен, что мое решение - это лучший или самый изящный, и меня интересуют улучшения и усовершенствования, если только для моего собственного эгоистического назидания!

Ответ 1

Строка кода в Каминари, которая реализует поведение, которое мы хотим изменить, находится в lib/kaminari/helpers/tags.rb в методе Kaminari::Helpers::Tag::page_url_for.

  def page_url_for(page)
    @template.url_for @template.params.merge(@param_name => (page <= 1 ? nil : page))
  end

Чтобы переопределить это поведение, я создал файл lib/kaminari/helpers/tag.rb, содержащий следующее:

module Kaminari
  module Helpers
    class Tag
      def page_url_for(page)
        @template.url_for @template.params.merge(@param_name => (page < 1 ? nil : page))
      end
    end
  end
end

Затем я зашифровал файл, добавив следующую строку в config/initializers/extensions.rb:

require "lib/kaminari/helpers/tag.rb"

Извиняюсь за любую неловкость с терминологией Ruby/Rails, я до сих пор довольно новичок в Ruby. Комментарии и критика приветствуются.

Ответ 2

ОБНОВЛЕНИЕ

Новая версия источника kaminari потребует это как обновленную строку:

@template.url_for @params.merge(@param_name => (page))

В противном случае вы потеряете другие параметры, переданные в ваш вызов страницы.

Для того, чтобы сделать это, вы получите полный вывод нового кода:

module Kaminari
  module Helpers
    class Tag
      def page_url_for(page)
        @template.url_for @params.merge(@param_name => (page))
      end
    end
  end
end

Вы по-прежнему помещаете это в файл инициализаций, как предложил Даниэль.

Ответ 3

На сегодняшний день (июль 2016 года) главная ветка Kaminari включает config params_on_first_page, который по умолчанию false.

Установка этого параметра конфигурации в true будет включать параметры страницы для всех страниц, включая страницу.

Обратите внимание, что главная ветвь не является стабильной версией, поэтому используйте ее с осторожностью!

Ответ 4

Это ответ на 2018 год, когда я пишу это:

Как указано на домашняя страница kaminari github

Запустите это, чтобы создать файл конфигурации для kaminari:

rails g kaminari:config

Это создаст файл kaminari_config.rb в папке config/initializers

Раскомментируйте строку: config.params_on_first_page = false и замените false на true:

config.params_on_first_page = true

При необходимости перезагрузите сервер. Что это:)