読者です 読者をやめる 読者になる 読者になる

RansackのURLを変更する方法

rails

ransack で複数カラムを検索する - rochefort's blog の続きです。
f:id:rochefort:20161102004719p:plain

ransack で title と description カラムを検索するようにしたのですが、
URLが微妙です。
 
こんな感じ。

?utf8=✓&q%5Btitle_or_description_cont%5D=test

やりたいこと

  1. utf8を消したい
  2. q[title_or_description_cont]= を q= にしたい

1.utf8を消したい

こちらが詳しいです。
Rails の utf8=✓ の歴史と消し方と snowman ☃ - Qiita

IE5-8 対応として入れられたものだそうですが、この辺りのサポートもどうでもいいので
パラメータから削除しました。

search_form_for (form_for) の optionに enforce_utf8: false を追加すればokです。

2. q[title_or_description_cont]= を q= にしたい

要望としては、複雑な検索ロジックではないので、simpleなクエリにしたいです。
 
公式のパラメータを変更する方法としては、以下のような as で設定する方法がwikiに記載されていますが この方法だと、title_or_description_cont のところを変更するようなので、 欲しいものとは違うようです。
Configuration · activerecord-hackery/ransack Wiki

<%= f.search_form_for @search, as: :log_search %>
<%= sort_link(@search) %>

 
 
search_form_for を使う限り q[xxxx] となってしまうようなので 思い切って form_tag でformを生成し、controllerで ransack の形式にparamsを修正することで対応してみました。

view

before
search_form_for を使っています。

<%= search_form_for(@q, enforce_utf8: false) do |f| %>
  <div>
    <%= f.text_field :title_or_description_cont, placeholder: "検索" %>
    <%= f.submit %>
  </div>
<% end %>

after
form_tag に変更です。qをget で渡すようにします。

<%= form_tag(videos_path, method: :get, enforce_utf8: false) do %>
  <div>
    <%= text_field_tag :q, params[:q], placeholder: "検索" %>
    <%= submit_tag %>
  </div>
<% end %>

controller

before
ransack に params[:q]を渡すだけでした。

@q = Video.published.ransack(params[:q])
@videos = @q.result.page(params[:page])

after
params[:q]title_or_description_cont をkeyにしたhashとしてransackに渡しています。

query = { title_or_description_cont: params[:q] }
q = Video.published.ransack(query)
@videos = q.result.page(params[:page])

これで以下のようになります。

?q=test