投稿検索機能(ransackの導入)

内容

コメント機能の前に、投稿検索機能を実装する

投稿検索機能

1. ransackを導入

ransackというgemを用いて検索機能を簡単に実装する
gemfile

gem 'ransack'

ターミナル

% bundle install
% rails s

2. 検索機能のMVC設定

collectionとmemberを用いて、ルーティングを設定する
これを使用すると、生成されるルーティングのURLと実行されるコントローラーを任意にカスタムできる
collectionはルーティングに:idがつかない、memberは:idがつくという違いがある
routes.rb

resources :posts, except: :index do
  collection do
    get 'search'
  end
end

コントローラーの編集
posts_controller.rb

before_action :set_search, only: %i[index search]

private
def set_search
  @q = Post.ransack(params[:q])
end

投稿一覧ページで検索ができるようにビューを編集(部分テンプレート)
_search.html.erb

<%= search_form_for @q, url: search_posts_path, class: "search-form" do |f| %>
# gteqとlteqオプションを用いると、範囲を指定した検索が可能
  <%= f.number_field :distance_gteq, placeholder: "例)5", class: "distance-search" %>km以上〜
  <%= f.number_field :distance_lteq, placeholder: "例)10", class: "distance-search" %>km以下
# eq_anyオプションを用いると、check_boxのどれかに当てはまるものを検索可能
  <% choices = ["多い", "やや多い", "どちらともいえない", "やや少ない", "少ない"] %>
  <% choices.each do |c| %>
    <%= f.check_box :traffic_eq_any, {multiple: true}, c, nil %>
    <%= f.label :traffic, c %><br>
  <% end %>
# contを用いると、指定したカラムの単語の一部分を含むものを検索可能
  <%= f.search_field :comment_cont, placeholder: "投稿を検索する", class: "search-input" %>
  <%= f.submit "検索", class: "search-btn" %>
<% end %>

3. ソート機能のMVC設定

次回

ソート機能実装しようとしたが、いろんなとこで詰まってしまったため持ち越し
ransackを使った方がやりやすいのか使わない方がいいのか、そこも考えて取り組みたい
あと今回実装した検索機能で、検索したらsearch.html.erbをビューとして返すようにしたが、indexアクションいじってindex.html.erbを使い回した方がいいかと思った(その場合、上記の記述は変わる)

参考

ransackを用いた複数カラムのキーワード検索

複数のカラムでキーワード検索したい場合は、以下のように記述する

# orを用いてカラムを複数指定
<%= f.search_field :address_or_comment_cont, placeholder: "投稿を検索する", class: "search-input" %>