###はじめに
今回、ransackというgemとJavaScriptを用いて、検索機能を実装した際に(勘違いして)いろいろ試したので、早速アウトプットしていきたいと思います。
###この記事を読むとどうなるのか?
・ransackについて少し詳しくなる
・キーワード検索する前に、一覧表示されているビューを表示しないようにできる
(必要ない実装でしたが、勘違いして、かなりの時間を費やしました)
###環境
Rails 6.1.2
###前提条件
ransackは導入済み
###手順
①完成しているアプリ
usersコントローラのnameカラムとageカラムについて検索結果が表示されています。
・現在のビュー
・実装コード
class UsersController < ApplicationController
def index
@q = User.ransack(params[:q])
@users = @q.result(distinct: true)
end
end
<div>
<%= search_form_for @q do |f| %>
<%= f.label :name_cont, "氏名" %>
<%= f.search_field :name_cont %>
<%= f.label :age_eq, "年齢" %>
<%= f.search_field :age_eq %>
<%= f.submit "検索" %>
<% end %>
<table>
<tbody>
<thead>
<tr>
<th>名前</th>
<th>年齢</th>
</tr>
</thead>
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.age %></td>
</tr>
<% end %>
</tbody>
</table>
</div>
このデフォルトの一覧表示を「消さないといけない!」と勘違いをして、いろいろ試行錯誤しました。(正しくは、表示しないように設定しました。)
・修正後のビュー
さっきまで、表示されていた一覧が消えました!!
・修正したコード
<div>
<%= search_form_for @q do |f| %>
<%= f.label :name_cont, "氏名" %>
<%= f.search_field :name_cont %>
<%= f.label :age_eq, "年齢" %>
<%= f.search_field :age_eq %>
<%= f.submit "検索" %>
<% end %>
<table>
<tbody>
<thead>
<tr>
<th>名前</th>
<th>年齢</th>
</tr>
</thead>
##ココにif文を追加
<% if @q.conditions.present? %>
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.age %></td>
</tr>
<% end %>
<% end %>
</tbody>
</table>
</div>
###調べたこと&考えたこと
####①デフォルトで、どのように処理されているのか?
Ransackは、シンプルモードとアドバンストモードの2つのモードを使用できます。
シンプルモード
このモードはメタサーチのような動きをし、とても少ない労力でセットアップすることができます。
シンプルモードを使用する場合の注意点としては以下です。
①デフォルトで送られるparamsのキーは「:search」ではなく「:q」です。これは主にクエリの文字列を短くするためですが、高度なクエリ(下記)はほとんどのブラウザでURLの長さの制限に違反し、HTTP POSTリクエストへの切り替えが必要です。このキーは設定可能です。
class UsersController < ApplicationController
def index
③@q = User.②ransack(①params[:q])
⑤@users = ④@q.result(distinct: true)
end
end
①デフォルトで「paramsキー」として送信されている
(ビューファイルから送られてくるパラメーター)
②ransackメソッド。送られてきたパラメーターを元にテーブルからデータを検索するメソッド。
③ユーザー情報(今回は、名前と年齢)を「@q」へ代入(@qが値を保持している)
④「@q」に対して、「.result」することで検索結果を取得
⑤「@users」へ代入される
⑥「index.html.erb」の「@users」へ渡されて表示される
このような流れで処理されているとわかったので!
ビューで条件分岐すれば良さそう!と思い、色々調べてみました!
####②present?メソッド
変数.present?
・resent?メソッドは、変数に値が入っていればtrueを。変数そのものが存在しない時は、falseを返す
<% if @q.conditions.present? %>
<% @users.each do |user| %>
<tr>
<td><%= user.name %></td>
<td><%= user.age %></td>
</tr>
<% end %>
<% end %
これによって、検索していない時は、一覧表示できないように設定ができました!
####まとめ
・今回、まったく関係のない実装に時間を費やしてしまいましたが、そのおかげでransackについて少し理解ができました。他に良い方法など、ございましたらコメント頂けると幸いです
####参考文献