LoginSignup
4
1

More than 1 year has passed since last update.

[Rails]ransackを使った検索機能

Posted at

今回は、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アクションでは検索結果を取得しています。

controllers/users_controller.rb
  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アクション用のルーティングを設定しておきます。

config/routes.rb
resources :users do
  collection do
    get 'search'
  end
end

ビュー

ビューでは、検索フォームと検索結果の表示をしていきます。

検索方法は、あいまい検索(部分一致)を指定。
ほかにも、「完全一致」「前方一致」「後方一致」などが指定できます。

views/users/index.html.erb
<!--検索フォーム-->
<%= 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を使ってかんたんな検索機能を実装してみました。

検索機能自体はできているのですが、実用化に向けてはまだまだ改善が必要です。

ソート機能や複数条件の指定、複数テーブルでの検索等、いろいろできますので、ご自身で調べてみてください。

時間があれば記事にします。

では、最後まで見ていただきありがとうございました。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1