【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から異なる変数を受け取れる
- search_form_forのurlオプションを
ってことでそれぞれのrenderでurlオプションを指定
url: boards_path
url: bookmarks_boards_path
以上。