今回は、ransack
というgemを使った検索機能の解説をしていきたいと思います。
ransack
を使うことで、検索機能をかんたんに実装することができます。
gemの素晴らしさを体感できる系ですねw
#開発環境
ruby 2.6.3
Rails 5.2.6
#前提
検索機能は、ユーザーの検索を例に出していくので、すでになんらかのアプリで、ユーザーが存在するものをご準備ください。
#手順
- gem ransackのインストール
- コントローラー
- ルーティング
- ビュー
#gem ransackのインストール
まずは、gem ransackをインストールします。
gem 'ransack'
を追加できたら
$ bundle install
#コントローラー
ではさっそく、検索の処理をコントローラーに記述していきます。
ここでは、usersコントローラーにsearchアクションには、検索の処理を、indexアクションでは検索結果を取得しています。
before_action :search
def search
# params[:q]のqには検索フォームに入力した値が入る
@q = User.ransack(params[:q])
end
def index
# distinct: trueは重複したデータを除外
@users = @q.result(distinct: true)
end
ん?なんでbefore_action使ってるのかって?
使わないとNo Ransack::Search object was provided to search_form_for!
というエラーが出ます。
これに結構苦しめられました。。
users/indexビューでsearch_form_forを使ったときに怒られるので、before_actionでどこのアクションでもsearchアクションを使えるようにしておきます。
#ルーティング
usersコントローラーのseachアクション用のルーティングを設定しておきます。
resources :users do
collection do
get 'search'
end
end
#ビュー
ビューでは、検索フォームと検索結果の表示をしていきます。
検索方法は、あいまい検索(部分一致)を指定。
ほかにも、「完全一致」「前方一致」「後方一致」などが指定できます。
<!--検索フォーム-->
<%= search_form_for @q do |f| %>
<!--name_contは、あいまい検索を指定-->
<%= f.text_field :name_cont %>
<%= f.submit "検索" %>
<% end %>
<!--検索結果-->
<% if @users.present? %>
<!--検索がヒットした場合-->
<% @users.each do |user| %>
<%= user.id %>
<%= user.name %>
<% end %>
<% else %>
<!--検索がヒットしなかった場合-->
<p>検索結果はありません</p>
<% end %>
#まとめ
ransackを使った検索機能の導入手順は以下
- gem ransackのインストール
- コントローラー
- ルーティング
- ビュー
今回は、ransackを使ってかんたんな検索機能を実装してみました。
検索機能自体はできているのですが、実用化に向けてはまだまだ改善が必要です。
ソート機能や複数条件の指定、複数テーブルでの検索等、いろいろできますので、ご自身で調べてみてください。
時間があれば記事にします。
では、最後まで見ていただきありがとうございました。