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


###はじめに

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

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

###環境
Rails 6.1.2

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

###手順

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

・現在のビュー

![スクリーンショット 2021-05-04 15.16.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/cdce9bb3-79b3-2523-bf4a-4f86120e6e4d.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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/923146/7aada4cf-67ea-feac-0876-de53e00b95c5.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:


####参考文献
- [【Ransack翻訳】Railsで検索機能を簡単に実装できるgem「Ransack」のREADMEを翻訳してみた](https://techtechmedia.com/ransack-readme-translation/)
- [activerecord-hackery/ransack: Object-based searching. - GitHub](https://github.com/activerecord-hackery/ransack)
- [Railsのpresentの使い方を現役エンジニアが解説【初心者向け】](https://techacademy.jp/magazine/20214)