こんにちは、Nanayakuです。
今回は、「ransack」というgemを使って検索フォームを作成したので、使い方などを紹介します。
モデル(テーブル)の作成などは解説せず、「ransack」のざっくりとした使い方を説明していきます。
そのため、ransackの詳しい設定方法などを知りたい人は、下記の記事へ移動してください。
参考記事・・・検索用のgem"Ransack"の簡易チュートリアルが書き上がってしまったので公開する
色々な検索フォームを知りたい人向け・・・[Rails]ransackを利用した色々な検索フォーム作成方法まとめ
目次
準備
Gemfileに下記を書いたら、bundleinstallします。
Gemfile
gem 'ransack'
$ bundleinstall
Controllerで検索機能(searchメソッド)を定義
今回、私はユーザーネームをキーワードで検索するフォームを作成しました。
method名は「user_search」とし、下記のように定義しました。
app/controllers/users_controller.rb
def user_search
@search_u = User.ransack(params[:q])
@search_users = @search_u.result
end
User.ransack(params[:q])の「params[:q]」は、検索フォームでユーザーが入力したキーワードのことです。
「ransack」は、Userモデル内のデータを検索するmethodです。
つまり、@search_u = User.ransack(params[:q])は、ユーザーが入力したキーワード(params[:q])を持つデータをUserテーブルから探し(User.ransack)、そのデータをインスタンス変数(@search_u)に格納しています。
ransackは、指定したカラムからキーワードを含むものを抽出しただけなので、その他のデータが入っていません。
そこで「resultメソッド」で他のデータを補填します。
注意
調べてみましたが、「ransack」「result」が正確に何を取得しているのか分からなかったため、上記の説明は私の予想が入っています。
入力フォームの作成(View)
bootstrapを使用しているため、containerなどが入っています。
Cssなどで装飾していますが、下記のコードで画像のようなフォームができます。
<div class="container add-color default-container">
<h1 class="text-white text-center">ユーザー検索</h1>
<h2 class="text-white text-center">キーワードを含むユーザーを検索できます</h2>
<div class="row">
<div class="col-md-offset-3 col-md-6 form-conter add-color">
<%= search_form_for @search_u, url:user_search_path do |f| %>
<div class="form-group">
<%= f.label :name_cont, "ユーザーネーム" %>
<%= f.search_field :name_cont, class: "form-control" %>
</div>
<%= f.submit "検索",class: 'btn-block btn-white ' %>
<% end %>
</div>
</div>
Bootstrapを取り除き、必要なコードは下記になります。
<%= search_form_for @search_u, url:user_search_path do |f| %>
<%= f.label :name_cont, "ユーザーネーム" %>
<%= f.search_field :name_cont %>
<%= f.submit "検索",class: 'btn-block btn-white ' %>
<% end %>
:name_con
「:name」は、nameカラムのことを示しています。
「_cont」は、部分一致のことでキーワードを含む検索をしたい場合は、これを使用します。
完全一致の場合は、「_eq」が使用されます。
他の検索条件やセレクトボックス・ラジオボタンなどの検索フォームを作ってみたい方は下記の記事を参考にしてみてください。
[Rails]ransackを利用した色々な検索フォーム作成方法まとめ
検索結果の表示
検索フォームのページを新しく作った人は、まずルートを設定しなければなりません。
get 'user/search' => 'users#search'
下記のように検索結果を繰り返し処理で表示し、検索できなかった場合のために、条件分岐を使います。
<% if @search_users.any? %>
<% @search_users.each do |result| %>
<%= link_to result.name, user_path(result.id) %>
<% end %>
<% else %>
<h1>キーワードを含むユーザーを検索できませんでした</h1>
<% end %>
まとめ
「ransack」は、簡単に検索フォームを作成できるgemです。
今作成しているアプリで検索フォームを作りたい人は、ぜひ使ってみて下さい。
最後に
備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。