Rails Ransackを用いて一覧画面に検索機能を追加しよう!


はじめに

Railsを開発していて一覧画面に検索機能を付けたいということがあると思います。
Ransackを用いると簡単に実装できるので実装手順を書いていこうと思います。
前提条件としてDBにnameカラムのようなものがあるといいですね。

Ransackのインストール

Gemfile
gem 'ransack'
=>bundle

Railsサーバを起動したままであれば一度このタイミングで再起動しておきましょう。
ransackをインストールすると、検索を行うためのransackメソッドがモデルに追加されます。

名称による検索

tasks_controller.rb
 def index
    @q = current_user.tasks.ransack(params[:q])
    @tasks = @q.result(distinct: true)
 end

続いて、タスク一覧画面に検索フォームを実装します

index.slim
 = search_form_for @q,class: 'mb-5' do |f|
  .form-group.row
   = f.label :name_cont, '名称', class: 'col-sm-2 col-form-label'
   .col-sm-10
     = f.search_field :name_cont, class: 'form-control'

ransackを利用する際は、検索フィールドの名前を一定のルールで命名します。
ここでは「名称に〇〇を含む」という検索を実現したいため、ビュー内の名称フィールドを「name_cont」としています。

最後に

名称だけでなく登録日時による検索もできるのでransackは便利ですね!