Gemfile
gem 'ransack'
$bundle install
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」とする。