投稿検索機能(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" %>