如何强制Kaminari始终包含页面参数?

Dan*_*ght 10 ruby pagination ruby-on-rails-3 kaminari

如果Kaminari的URL生成链接返回第一页,则会忽略页面参数.但是,如果省略页面参数,则应用程序旨在选择随机页面.因此,Kaminari的默认行为会阻止以可靠的方式返回第一页.

我已经解决了这个问题,稍后会发布我的解决方案,但我想发布这个问题给后人,我也是Rails的新手,因此我不确定我的解决方案是最好的还是最好的优雅,我对改进和改进感兴趣,如果只是为了我自己的自私教育!

Dan*_*ght 14

实现我们想要改变的行为的Kaminari中的代码行在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
Run Code Online (Sandbox Code Playgroud)

要覆盖此行为,我创建了一个文件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
Run Code Online (Sandbox Code Playgroud)

然后我通过添加以下行来修补文件config/initializers/extensions.rb:

require "lib/kaminari/helpers/tag.rb"
Run Code Online (Sandbox Code Playgroud)

我对Ruby/Rails术语的任何尴尬表示道歉,我对Ruby仍然相当新.欢迎提出意见和批评.


bar*_*ncw 8

UPDATE

新版本的kaminari源将需要此作为更新的行:

@template.url_for @params.merge(@param_name => (page))
Run Code Online (Sandbox Code Playgroud)

否则你将失去通过你的分页电话的其他参数.

为了clairity缘故,这里是新代码的完整输出:

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

如Daniel建议的那样,您仍然会将其置于初始化文件中.


Gre*_*ley 6

截至今天(2016年7月),Kaminari 主分支包含一个配置选项 params_on_first_page,false默认情况下.

将此配置选项设置为true将包括所有页面的页面参数,包括第1页.

请注意,主分支不是稳定版本,因此请谨慎使用!