ransack で複数カラムを検索する - rochefort's blog の続きです。
ransack で title と description カラムを検索するようにしたのですが、
URLが微妙です。
こんな感じ。
?utf8=✓&q%5Btitle_or_description_cont%5D=test
やりたいこと
- utf8を消したい
- 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