学習記録

アウトプット用に作りました

ransackを使ってプルダウンのセレクトボックスを作る

以前ransackを使った基本の検索機能の作り方をまとめていました。
ransackを使って検索機能を実装する - 学習記録

またransackを使った日付検索の機能の実装についてもまとめてあります。
ransackを使った日付検索 - 学習記録


今回は下記のようなプルダウンのセレクトボックスを使って検索機能を実装していこうと思います。

f:id:kimura34:20210319153722p:plain


ユーザーの性別を検索する機能を例として作成していきます。

まずuserテーブルにgenderカラムを追加して、
userモデルにenum gender: { man: 0, woman: 1 }を定義してあるか確認します。


私は最初下記のようにコードを書いていたのですが、エラーが出てしまいました。

<%= search_form_for @q, url: hoge_path do |f| %>
  <div class="input-group mb-3">
      <%= f.select :gender_eq, [["男性”, 0], ["女性”, 1]] %>
  </div>
<% end %>


enumはransackに対応していないという記事を見たので、
その記事に書いてあるコードを使って書き換えてみました。

<%= f.select :gender_eq, User.genders.invert.map{|key, value| [key, User.genders[value]]} %>

User.gender {"man"=>0, "woman"=>1}が出力されます。
User.genders.invert {0 =>"man", 1 =>"woman"}が出力されます。
invertメソッドを使うことで文字を出力することができわかりやすくなります。

mapメソッドを使って、keyが0、valueに"man"が代入されます。


もしもenum_helpを使ってi18nが使えるようになっていたら、
User.genders_i18n.invertとすることで、{"man" =>"男性", "woman" =>"女性"} という日本語表記で出力することもできます。

mapメソッドを使って、keyが0、valueに"man"が代入されます。


参考

【開発メモ】Ruby on Railsのform_forでドロップダウンリストの選択ボックスを設置する方法 | FREE SWORDER

RansackはRailsのenumに対応していないっぽい | 地方でリモートワーク