こんにちは。GeekSalonのプログラミング駆け出しメンターです。
今日はgem(ransack)を使用せずに実装できるプルダウン検索機能についての記事を書こうと思います。
初めて記事を書くので、温かい目で見てくださると嬉しいです。
目次
①前提
②開発概要
③実際のコード
前提
○開発環境
Ruby 3.0.4
Rails 6.1.6
○前提
・ ListでのCRUD機能実装済み
・ 新規投稿ページでプルダウン機能を実装
開発概要
①投稿時にプルダウンで選択した情報を、変数を使って検索をプルダウン式でかける。
②検索用のparamsをコントローラーで作成
・検索したいカラムの選択項目を検索バーにも作成する
③コントローラーで検索した結果だけを表示する変数を作る
・ビューに表示
実装イメージはこちら
左上がプルダウン検索バーになっています。
選択して検索をかけると、検索条件に当てはまる投稿一覧を表示します。
検索結果も表示可能です。
ー新規投稿ページー
このように新規投稿ページでもプルダウン選択で指定しておきます。
機能実装コード
コントローラー作成とモデル作成は省きます。
新規投稿(newページ)を作成する際、簡単なプルダウン選択を実装しておいてください。
<%= form_for @list do |f| %>
<div class="new_2_field">
<%= f.label :price %>
<br>
<%= f.select :price, [["〜1000円", "〜1000円"], ["〜2000円", "〜2000円"], ["〜3000円", "〜3000円"], ["〜4000円", "〜4000円"]], include_blank: "選択して下さい" %>
<br>
<%= f.submit "投稿する" %>
<% end %>
selectタグを使ってこのようにプルダウン機能を実装します。
投稿一覧ページの実装
続いて実際に一覧ページで検索して表示するところを実装します。
まず検索して情報の受け渡しを行えるようにparamsを使って変数を定義します。
def index
@lists = List.all
@searchprice = params[:search]
end
コントローラーで定義したら、実際に検索バーを作ります。
<%= form_tag({controller:"lists",action:"index"}, method: :get) do %>
<%= select_tag :search, options_for_select([["〜1000円","〜1000円"],["〜2000円","〜2000円"],["〜3000円","〜3000円"],["〜4000円","〜4000円"]]) %>
<%= submit_tag "絞り込み" %>
<% end %>
select_tagで先ほど指定したparamsを指定して、options_for_selectで検索する内容を指定します。その中身を検索する選択項目に自由に変えて実装してください。
※新規投稿ページで先ほど指定した内容と全く同じでないと検索かからないので注意してください。
次に実際に検索した条件での投稿表示のコードを実装していきます。
def index
@lists = List.all
@searchprice = params[:search]
@search = @lists.where(price: @searchprice) #追加
end
投稿表示を行う変数を@searchで定義します。whereで条件を指定して、検索したいカラムを指定(price)して情報の受け渡しをするために先ほど定義した@searchpriceを定義しておきます。
そして最後にeachメソッドで投稿表示するだけ!
<% @search.each do |s| %>
<p><%= s.price %></p>
#表示したいものを中に書いてね!
<% end %>
whereで条件分岐した変数@searchをeachメソッドに入れて検索条件にあった投稿を表示します。
検索結果表示
最後に検索する際に選択したものを表示するために記述を加えます。
検索結果:<%= params[:search] %>
情報の受け渡しをおこなっているparamsを表示することで選択した項目を表示することができます。
最後に
ransackを使ったとき、他のgemとの兼ね合いでエラーが出てつまづくことが多かった私からすると、こっちの方が実装早いなと思い今回記事を書きました。
初心者の方には実装しやすい機能だと思います。
またもっといい方法があれば教えていただけると初心者からするととても嬉しいです。
自分でももっといい方法があるのか試行錯誤していこうと思います。