ransackを使って検索機能を実装する【rails】

はじめに

railsアプリにransackを導入して検索機能を実装する方法について

設定方法

まずはransackというGemをインストールします。

gem 'ransack'

今回は掲示板一覧ページに、タイトルと本文を部分一致検索できるような検索機能を作ります。

コントローラを下記のように修正します。

  def index
    @boards = Board.all.includes(:user).page(params[:page])
  end
  def index
    @q = Board.ransack(params[:q])
    @boards = @q.result(distinct: true).includes(:user).page(params[:page])
  end

distinct: trueは、関連する子テーブルの情報を条件に絞り込んで、親テーブルの検索結果を表示するときに、

検索結果が重複してしまうことがあるので記載する必要があります。

例えば、コメントを指定して、掲示板を検索結果として表示するときなどです。

基本的にはつけておけば問題ないのでつけておきます。

続いてビュー側に検索機能を追加します。

<%= render 'search_form', q: @q, url: boards_path %>
<%= search_form_for q, url: url do |f| %>
  <div class="input-group mb-3">
    <%= f.search_field :title_or_body_cont, class: 'form-control', placeholder: '検索ワード' %>
    <div class="input-group-append">
      <%= f.submit '検索', class: 'btn btn-primary' %>
    </div>
  </div>
<% end %>

検索機能を実装するときは、search_form_forを使います。

そして、コントローラで定義したqurlを渡します。

urlを明示的に指定しないと意図しない挙動になってしまうことがあるので、

どのアクションに向けてリクエストを投げるのかを意識してコーディングすることが大事です。

:title_or_body_contは、titleカラムとbodyカラムの文言に対して部分一致検索するための記述です。

ちなみにplaceholderは検索フォームの初期値を設定できます。

f:id:study-output:20210501170621p:plain

f:id:study-output:20210501170636p:plain