ransackを使った検索機能

gemransackを用いると、簡単に検索機能を追加できる

導入

gem 'ransack'

$ bundle install

これでransackのインストールは完了

コントローラーの編集

検索するためのアクションを追加します。検索した結果を表示するために新たにsearchアクションを追加する。

Rails.application.routes.draw do
  resources :users do
    collection do
      get 'search'
    end
  end
end

このような形でcollectionを使って、/users/searchのURLでsearchアクションを拾えるようにする。

コントローラに検索を行うための記述をする。 検索結果を取得するコードをprivate以下にメソッド化し、before_actionで呼び出す。そして、searchアクションを定義する。

class UsersController < ApplicationController
  before_action :set_q, only: [:index, :search]

  def search
    @results = @q.result
  end

  private

  def set_q
    @q = User.ransack(params[:q])
  end
用語 説明
params[:q] この後に作成するビューファイルから送られてくるパラメーター
ransackメソッド 送られてきたパラメーターを元にテーブルからデータを検索するメソッド
resultメソッド ransackメソッドで取得したデータをActiveRecord_Relationのオブジェクトに変換するメソッド

検索フォームの作成

ビューファイルに検索フォームの作成をしていく。

<h1>ユーザー検索</h1>
<%= search_form_for @q, url: search_users_path do |f| %>
  <%= f.label :name_cont, 'ユーザー名' %>
  <br>
  <%= f.submit '検索' %>
<% end %>

search_form_forというform_withのようなメソッドがransackに用意されているのでそれを使う。

_contは検索したいカラム名を前に入れると、検索したいカラムに対してあいまい検索がされる。完全一致の場合_eqがある。

検索結果が表示されるビューを作成

<h1>検索結果</h1>
<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Age</th>
      <th>Height</th>
      <th>Weight</th>
      <th>Gender</th>
      <th colspan="3"></th>
    </tr>
  </thead>

  <tbody>
    <% @results.each do |user| %>
      <tr>
        <td><%= user.name %></td>
        <td><%= user.age %></td>
        <td><%= user.height %></td>
        <td><%= user.weight %></td>
        <td><%= user.gender %></td>
        <td><%= link_to 'Show', user %></td>
        <td><%= link_to 'Edit', edit_user_path(user) %></td>
        <td><%= link_to 'Destroy', user, method: :delete, data: { confirm: 'Are you sure?' } %></td>
      </tr>
    <% end %>
  </tbody>
</table>

<%= link_to 'Top', users_path %>

<% @results.each do |user| %>の部分で結果をもとに繰り返し表示させている。

参考

https://pikawaka.com/rails/ransack