プログラミング

ransackで検索フォームを作成

投稿日:

こんにちは、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です。

今作成しているアプリで検索フォームを作りたい人は、ぜひ使ってみて下さい。

 

最後に

備忘録がわりに作ったので、間違っている所とかあったら、コメントくれると嬉しいです。

-プログラミング
-

Copyright© Nanayaku blog , 2019 All Rights Reserved Powered by AFFINGER5.