Rails search_form_forの中で複数個submitボタンを用意し検索対象を絞る

開発現場でRailsを利用しています。

検索機能にはransacを利用しており、ある時search_form_forの中で、検索対象を切り分ける場面がありました。

何日か考えてしまったので、備忘録として残しておこうと思います。

具体的な要件のイメージ

  • 関東ボタンを押す → 案件一覧ページに関東に紐付いた案件が全部表示される

  • 関西ボタンを押す → 案件一覧ページに関西に紐付いた案件が全部表示される

  • 九州ボタンを押す → 案件一覧ページに九州に紐付いた案件が全部表示される

困っていたこと

  1. search_form_forの中でf.submitって複数個使えるの?
  2. viewからcontrollerに対して値(フラグとかパラメーターとか)を飛ばすことは可能?
  3. JS使わないとできないのかな?

解決方法(実装概要)

  1. HTMLのname属性を利用する。
  2. コントローラーで対象のname属性を受け取り条件分岐を使い処理を行う。

具体的にどうやったの(実際のコード)

  • HTML
<input type="submit" name="area_kanto" value="関東" >
<input type="submit" name="area_kansai" value="関西">
<input type="submit" name="area_kyusyu" value="九州">
  • View側(Slimです。BootStrap使っています。)
.flex-column
  h5.font-weight-bold.my-3.pl-2 エリアで絞る
    .search-area.d-flex.justify-content-around
      = f.submit '関東', name: 'area_kanto'
      = f.submit '関西', name: 'area_kansai'
      = f.submit '九州', name: 'area_kyusyu'
  • Contoroller側
if params[:area_kanto]
  area_kanto_array = Area.where_area_kanto.concat(params[:q][:area_id_in])
  params[:q][:area_id_in] = area_kanto_array
end

if params[:area_kansai]
  area_kansai_array = Area.where_area_kansai.concat(params[:q][:area_id_in])
  params[:q][:area_id_in] = area_kansai_array
end

if params[:area_kyusyu]
  area_kyusyu_array = Area.where_area_kyusyu.concat(params[:q][:area_id_in])
  params[:q][:area_id_in] = area_kyusyu_array
end

Area.where_area_kanto
Area.where_area_kansai
Area.where_area_kyusyu
はAreaモデルに記載したScopeの呼び出しです。それをransacの検索条件にconcatで配列結合しています。
ここらへんはこの記事とは関係ないです。

学び

HTMLのname属性使えばparams[:属性名]で検知できるんだ〜ってことでした。