積々RUNMIZZO

日々積み重ね

【Ruby on Rails】検索機能の実装(ransack)


本日もざっくり学習メモ✍


  • gem 'ransack'をインストール

  • ransackにはシンプルモードとアドバンスモードがあるらしい(今回はシンプルモード)

  • コントローラー

def index
  @q = Board.ransack(params[:q])
  @boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
end
用語 説明
params[:q] Viewファイルから送られてくるパラメーター
ransackメソッド 送られてきたパラメーターを元にテーブルからデータを検索するメソッド(リクエストが無ければ全件を返す)
resultメソッド ActiveRecord_Relationのオブジェクトに変換する
distinct: true 子テーブルから取得するデータの重複を取り除く(今回コメントは検索しないから無くてもいける)


  • ビュー
<%= search_form_for @q 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 form_forの検索フォームバージョンみたいなもの
f.search_field :title_or_body_cont, ~ titleとbodyカラムに対して_contで部分一致検索を可能にしている


Bookmark一覧にも実装

  • urlを指定しないとリクエストが/boardsになってしまってindexページでの結果になる
    • 何故?(上の@qが先に読み込まれるから?)📝
<%= search_form_for @q, url: bookmarks_boards_path do |f| %>
  • ここで基本Viewが同じなのでパーシャる

    • search_form_forのurlオプションをurl: urlにしたら、それぞれのrenderから異なる変数を受け取れる
  • ってことでそれぞれのrenderでurlオプションを指定

    • url: boards_path
    • url: bookmarks_boards_path


以上。


参照


ransackで検索機能を実装する - Ruby on Rails Learning Diary