備忘録です!!
##ransackをインストール
gem 'ransack'
bundle installしてください。
##コントローラーの設定
今回は、掲示板の投稿一覧、ブックマーク一覧の検索機能を実装していきます。
def index
@search = Board.ransack(params[:q])
@board = @search.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
end
def bookmarks
@saerch = current_user.bookmark_boards.ransack(params[:q])
@bookmark_board = @search.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
end
検索のパラメーターは、デフォルトでparams[:q]となっています。
ransackメソッドに検索のparamsを渡してあげて、インスタンスを生成。
生成されたインスタンスをresultメソッドで呼び出して、検索結果を表示させています。
distinct: trueは、今回なくても大丈夫です。
distinct: trueというのは、「関連する子テーブルの情報を条件に絞り込んで、親テーブルの検索結果を表示するとき」に使用します。
例えば、掲示板1という投稿に、
「rails楽しい」
「rails勉強中」
という二つのコメントがあったとします。
railsと検索した時に、distinct: trueがないとr、掲示板1が2回取得されて検索結果が2件になってしまいます。
それを、防ぐ為に、distinct: trueを用います。
##viewの追加
検索用のviewは、パーシャルで作成してきます。
<%= search_form_for search, url: url do |f| %>
<div class='input-group mb-3'>
<%= f.search_field :title_or_body_cont, placeholder: "検索ワード", class: 'form-control' %>
<div class='input-group-append'>
<%= f.submit value: "検索", class: 'btn btn-primary' %>
</div>
</div>
<% end %>
search_form_forには、先ほどコントローラーで設定した、検索オブジェクト(search)、urlを渡してあげます。
urlを指定しない場合、ブックマーク一覧の検索フォームでリクエストするurlが、/boardsになってしまいます。
これは、BoardsController#indexにルーティングされます。
本来は、bookmarkアクションを呼び出して欲しいので、urlを指定する必要があります。
title_or_body_contは、タイトルと本文が部分一致を示しています。
(_contが部分一致を表す)
<%= render 'search', url: boards_path, search: @search %>
これで完成です。