3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

検索機能の実装

Posted at

備忘録です!!

##ransackをインストール

gem 'ransack'

bundle installしてください。

##コントローラーの設定

今回は、掲示板の投稿一覧、ブックマーク一覧の検索機能を実装していきます。

board_controller.rb
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は、パーシャルで作成してきます。

boards/_search.html.erb
<%= 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が部分一致を表す)

board/index.html.erb

<%= render 'search', url: boards_path, search: @search %>

これで完成です。
3
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?