今回の場合は、ransackというGemを利用して検索機能を実装する


ransackを導入する

Gemfile

gem 'ransack'
$bundle install

Controllerを編集する

class BoardsController < ApplicationController
  def index
    @q = Board.ransack(params[:q])
    @boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
  end

  def new
  end

  def bookmarks
    @q = current_user.bookmark_boards.ransack(params[:q])
    @bookmark_boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
  end

・検索フォームを配置するindexアクション(掲示板一覧)とbookmarksアクション(お気に入り一覧)を修正していく。

params[:q]→フォーム(_search_form.html.erb*後で作る)から送られてくるパラメーター。

ransackメソッド→送られてきたパラメーターを元にテーブルからデータを検索するメソッド

@q = Board.ransack(params[:q])→フォームから送られてきたパラメーターを元にboardsテーブルからデータを検索している。

resultメソッド→ransackメソッドで取得したデータをActiveRecord_Relationのオブジェクトに変換するメソッド。

@q.result→検索結果を渡している。・distinct: true→レコードを取得する際に重複を防いでくれる。


検索フォームの作成

<%= search_form_for @q, url: url do |f| %>
  <div class = "input-group mb3">
    <%= f.search_field :title_or_body_cont, class: 'form-control', placeholder: t('default_search_word') %>
    <div class = "input-group-append">
      <%= f.submit class: 'btn btn-primary' %>
    </div>
  </div>
<% end %>

search_form_forメソッド→ransackで用意されているメソッド(*form_forやform_withのransack版のようなもの)

・引数に「q」を設定。これは、「app/views/boards/bookmarks.html.erb」、「app/views/boards/index.html.erb」のそれぞれで呼び出し時に、boardコントローラーの「bookmarksアクションの@q」,「indexアクションの@q」をそれぞれ代入したいので、使い回しやすくするために「q」とする。