ヘッダーに検索(ransack)を入れた時のまとめ 〜Ruby on Rails4〜
検索として、gem ransackを使った。
ページのヘッダー(メニュー)のところにransackを入れる時に躓いたのでそのまとめをしておく。
ransackの導入
Gemfileに以下を記述して、【bundle install】した。
gem 'ransack'
現状、lessonsコントローラーがあり、サイトTOPは【lessons#home】に指定している。そのため、検索結果は【lessons#index】に飛ばしたい。
※この辺りで躓いた。。。
コントローラ、ビューへの記載
検索結果はgem kaminariを使ってページングで表示する。
lessonsコントローラのindexアクションに以下を記述。
@search = Lesson.search(params[:q])
@search_lessons = @search.result.page(params[:page]).per(3)
#per内の数字は1ページに表示したい検索結果の数を記載
また、ページ内のヘッダーに以下を記述した。
※bootstrap3を使っているため以下のような記述になりました。
<div class="form-group navbar-form navbar-left">
<%= search_form_for @search do |f| %>
<%= f.text_field :summary_cont, :placeholder => "レッスン検索", :size => "13px", :class => "form-control" %>
<%= f.submit '検索', :class => "btn btn-default" %>
<% end %>
</div>
【:summary_cont】はlessonテーブル内の【summary】カラムを検索してって意味らしい。
※間違ってたら指摘とかもらえると嬉しいです。。。
あと、【:size】がうまく機能せず、ちょっと戸惑う。13pxとかしたけど、それなりの大きさで表示されました。単位は無視されるんでしょうか?
この状態で「検索」ボタンを押すと、【lessons#index】では検索結果が表示されるが、それ以外のページでボタンを押すと上記ページにリダイレクトが出来なかった。
検索結果を【lessons#index】にリダイレクト
結果は簡単で、【search_form_for】に【url:】を入れれば良かった。
<div class="form-group navbar-form navbar-left">
<%= search_form_for @search, url: lessons_path do |f| %>
<%= f.text_field :summary_cont, :placeholder => "レッスン検索", :size => "13px", :class => "form-control" %>
<%= f.submit '検索', :class => "btn btn-default" %>
<% end %>
</div>
でも、これにずいぶん時間を取られたな。。。
今後の検索機能として
今の検索はlessonテーブルのsummary部分のみを検索しているが、titleも検索したい。
そのため、titleなど他のカラムを検索できるようにカスタマイズする予定です。