Railsでransackを使って検索画面を作る【初心者】

Railsの勉強にハマりだして1つ自分の好きなジャンルでサイトを作っています。どんなサイトを作るつもりなのかゴールがあると勉強もはかどりやすいです。今回は検索画面をRailsのGemの「ransack」を使って実装しました。

今回のゴール
1.同一ページに検索結果を表示する
2.別の検索結果ページにパラメーターを渡して表示
3.検索結果のパラメーター(url)に&commitやutf8の表示を入れなくする

まずはransackを導入します。

>Gemfile

gem 'ransack'

 

を記述してコマンドラインで

$ bundle install

これでインストールは完了。

 

続いて実装。
まずは「1.同一ページに検索結果を表示する」からやっていきます。コメントアウトで説明を記載しています。

controller側

def result↲ @search = Bike.ransack(params[:q])
#→(params[:q])に検索パラメーターが入り、Bikeテーブルを検索する@searchオブジェクトが生成される。

@resultbikes = @search.result
#検索結果を表示する@resultbikesオブジェクトを生成する

view側

<%= search_form_for @search, enforce_utf8: false, url: articles_result_path do |f| %>
#→enforece_utf8: falseでurlにutf〜を表示させない。IE対策の名残とか。url:で指定したviewに飛ばすことができる。

<%= f.label :name_cont, "Name" %>
<%= f.text_field :name_cont %>
#→検索対象のカラムを:hoge_contで示す。idだったらid_cont。

<div class="actions"><%= f.submit "Search" %></div>
#→検索ボタン
<% end %>

 

これだけだと検索結果を表示するviewがないので別で新しく作る。

<% @resultbikes.each do |kekka| %>
<p><%= kekka.id %></p>
<p><%= kekka.name %></p>
<% end %>

これだときっと検索する前にこのviewを表示してしまうので、if文でもし検索したら〜みたいなのが必要と思われる。

これで1は完了。

2.別の検索結果ページにパラメーターを渡して表示
よくポータルサイトとかで検索すると?q=hogehogeとかって出るあれを実装したくてチャレンジした。1.とは別のコントローラーを用意した。

routingを用意する

get "articles/result" => "articles#result"

articles_controller(仮名

query = { name_cont: params[:kwd] }
#→検索したいカラムをkeyにしたhashとしてparams[:q]をqueryに入れる。[:kwd]の部分はurlに表示させるパラメーターの名前なのでお好みで。

kwd = Bike.ransack(query)
@resultbikes = kwd.result
end

view側も書き方が異なる

<%= form_tag(articles_result_path, method: :get, enforce_utf8: false) do %>
#→search_form_forではなくなる。結果を表示させるパスとmethod: :getとする。enforce_utf8は1.と一緒。

<%= text_field_tag :kwd, params[:kwd], placeholder: "検索" %>
#→コントローラーで指定したカラムで検索する

<%= submit_tag("検索", name: nil) %>
#→ name:nilとしておくと検索結果のurlに&commit=hogeという文字列が入らなくなる

結果
http://localhost:3000/articles/result?kwd=1000
とシンプルにすることができた。

 

参考にしたページ

https://qiita.com/fujitora/items/b2134bf6abcfda79c47f

 

この記事が気に入ったら
いいね ! しよう