#11 ransackで検索機能を作成
第11回では、検索機能をつくります。今回はransackを使います。
Gemfileに追加
gem 'ransack'
$ bundle install
以下のリンクを参考にしながら作業を進めていきます。
当初の実装
application_controller.rb
before_filter :set_search def set_search @q = Question.ransack(params[:q]) end
questions_controller.rb
def index @q = Question.ransack(title_or_content_cont: params[:q]) @questions = @q.result end
application.html.slim
= search_form_for @q, url: questions_path do |f| = f.search_field :title_or_content_cont
公式のリファレンスを読みながらつくってみたのですが、ransackを利用して検索フォームをヘッダーに設置するにはApplicationControllerのbefore_filterで変数をセットするなど手を加える範囲が広かったため、下記の方法に修正しました。
修正後
questions_controller.rb
def index @questions = Question.ransack(title_or_content_cont: params[:q]).result end
application.html.slim
= form_tag questions_path, method: :get do = text_field_tag :q, (params[:q] or nil)
search_form_forの使用をやめてform_tagに変更しました。次に「/search?q=キーワード」のようなURLでアクセスするためにルーティングの設定を行います。
routes.rb
get 'search' => 'questions#index', as: :search
無事に動作を確認できたのでbootsnippを利用して検索フォームと検索結果ページを作成し、検索機能を作成しました。
現在の状態