2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ransackで、全件一覧表示を消してみた(備忘録)

Last updated at Posted at 2021-05-04

###はじめに

今回、ransackというgemとJavaScriptを用いて、検索機能を実装した際に(勘違いして)いろいろ試したので、早速アウトプットしていきたいと思います。

###この記事を読むとどうなるのか?
・ransackについて少し詳しくなる
・キーワード検索する前に、一覧表示されているビューを表示しないようにできる
(必要ない実装でしたが、勘違いして、かなりの時間を費やしました)

###環境
Rails 6.1.2

###前提条件
ransackは導入済み

###手順

①完成しているアプリ
usersコントローラのnameカラムとageカラムについて検索結果が表示されています。

・現在のビュー

スクリーンショット 2021-05-04 15.16.32.png

・実装コード

users_controller.rb
class UsersController < ApplicationController

  def index
    @q = User.ransack(params[:q])
    @users = @q.result(distinct: true)
  end
end
index.html.erb
<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>

このデフォルトの一覧表示を「消さないといけない!」と勘違いをして、いろいろ試行錯誤しました。(正しくは、表示しないように設定しました。)

・修正後のビュー
スクリーンショット 2021-05-04 15.30.49.png
さっきまで、表示されていた一覧が消えました:relaxed:!!

・修正したコード

index.html.erb
<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リクエストへの切り替えが必要です。このキーは設定可能です。

users_controller.rb
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を返す

index.html.erb(一部抜粋)
    <% if @q.conditions.present? %>
      <% @users.each do |user| %>
        <tr>
          <td><%= user.name %></td>
          <td><%= user.age %></td>
        </tr>
      <% end %>
    <% end %

これによって、検索していない時は、一覧表示できないように設定ができました!

####まとめ
・今回、まったく関係のない実装に時間を費やしてしまいましたが、そのおかげでransackについて少し理解ができました。他に良い方法など、ございましたらコメント頂けると幸いです:relaxed:

####参考文献

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?