4
3

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 1 year has passed since last update.

掲示板の検索機能

Posted at

最近掲示板の検索機能の実装方法を学んだのでこちらにアウトプットしておきます。

検索機能の実装

検索バーをransackというgemを使って実装していきます。
Ransackはデータベースから特定の条件に一致するレコードを探すための検索クエリを生成する機能を提供します。

手順

ransackのインストール
②コントローラーの編集
③viewの編集
④国際化(任意)

ransackのインストール

Gemfileに以下のコードを記入

Gemfile
gem 'ransack'
$ bundle install

②コントローラーの編集

boards_controller.rb
#編集前
def index
@boards = Board.all.includes(:user).order(created_at: :desc).page(params[:page])
end
↓↓
def index
    @q = Board.ransack(params[:q])
    @boards = @q.result(distinct: true).includes(:user).order(created_at: :desc).page(params[:page])
  end

URLパラメータparams[:q](これが検索条件)を使用してBoardモデルに対する検索クエリを生成しています。
検索クエリ@q.result(distinct: true)を実行し、その結果を取得しています。また、その結果から重複するレコードを除外するように指定(distinct: true)しています。
※掲示板Aに対して「rails1」というコメントと「rails2」というコメントがある場合、このdistinct: trueを入れないと、railsでコメントを検索した場合に、掲示板Aが2回取得されて検索結果が2件になってしまったり、エラーの原因にもなります。

④viewの編集

検索バーの実装はできている程で進めていきます。
パーシャルを作成します

views/boards/_search.html.rb
<form>
  <%= 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>
    <% end %>
  </div>
</form>

search_form_forというransackが提供するフォームヘルパーを使ってフォームを作成。
※検索クエリのように一貫性が保たれる変数はインスタンス変数@qとしてパーシャルに渡し、特定の状況に依存する変数はローカル変数qとしてパーシャルに渡すことで、パーシャルの再利用性を高めることができます。

app/views/boards/index.html.erb
<%= render 'search_form', url: boards_path %>

これで掲示板一覧で検索機能を実装することができました。

4
3
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
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?