全アクション共通メソッドを利用してナビゲーションバーに検索フォームを配置する

検索フォームをナビゲーションバーのような共通viewファイルに置くにはどうしたらいいのか、一瞬迷ったのでメモ。

今回は、以下で作成した検索フォームをnavigation barに配置したいと思います。

totutotu.hatenablog.com

実装

Railsでは、全てのControllerがApplicationControllerクラスを継承しています。

なので、このApplicatoinControllerクラスでbefore_actionを設定してやります。ransackでは、検索フォームのヘルパーメソッドに検索クエリを食わせてやる必要があるので、以下のようにして全てのアクションで@qを仕込めるようにします。

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_action :set_search_query

  def set_search_query
    @q = Bean.search(params[:q])
  end
end

これであとはViewアフィルにフォームを差し込めばいいだけです。

  %body
    %nav
      - # ...
      = search_form_for @q do |f|
        = f.label :id_cont, "id"
        = f.search_field :id_cont
        %br
        = f.label :origin_name_cont, "オリジン"
        = f.search_field :origin_name_cont
        %br
        = f.label :origin_name_or_bean_variety_name_or_bean_cultivar_name_cont, "オリジン or 種 or 品種"
        = f.search_field :origin_name_or_bean_variety_name_or_bean_cultivar_name_cont
        %br
        = f.submit
      %hr

    = yield

ということで、簡単にできました。一応メモということで。