#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を利用して検索フォームと検索結果ページを作成し、検索機能を作成しました。

現在の状態

f:id:tsyknsr:20160705222149p:plain

参考