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| %>
の部分で結果をもとに繰り返し表示させている。