Ransackのsort_linkのURLクエリからパラメーターを除外する

Ruby on Railsで、ransackのsort_linkヘルパーを使うと、?q%5Bs%5D=name+asc のようなURLのアンカーを作成してくれる。

この時、同時にkaminariでページネーションをしていると、sort_linkはparamsを自動的にマージするので、?page=2&q%5Bs%5D=name+asc のようなURLになる。

sort_link :id, page: nil のようにpageパラメータをnilで上書きしてあげると、作成されたURLのクエリにpageは設定されなくなる。

なお、sort_link :id, params: { page: nil } では pageは上書きされない。sort_link :id, params: { page: 1 } と書くとURLのクエリにpageが2つ設定される。

ransackのソースコードを見ると、paramsとsort_linkに指定したオプションをマージして直接 url_for に設定している。

https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/helpers/form_helper.rb#L131

def url_options
  @params.merge(
    @options.merge(
      @search.context.search_key => search_and_sort_params))
end

https://github.com/activerecord-hackery/ransack/blob/master/lib/ransack/helpers/form_helper.rb#L92

send(routing_proxy).url_for(options_for_url)

include?(true)の公式

a = Array<true|false> である場合、a.include?(true) は any? で置き換えることができる。

a = Array<T>(Tは任意のクラス)、block.call(T) => (true|false) である場合、a.map(&block).include?(true) は a.any?(&block) で置き換えることができる。