ransackでヒット0件の時には検索結果に何も表示させない方法


通常の検索結果


全データの中から、検索ワードにヒットしたものだけが表示される。

もしヒットがない場合、全データが表示される。
(上記でいうと渋谷も含め六本木でも川崎でも出てくる)

・・・なぜ?

(どうもransackを使う際、controller側で記載する.result(検索を行うメソッド)の仕様上こうなっている模様。)

やりたいこと

ヒット0件の場合、検索結果に何も表示させない。

やり方

ransackの使い方は色々とわかりやすい記事があるので
そちらで確認してください。ここでは省略します。

controller.rb
def hoge
@search = Post.ransack(params[:q])#[:q]の中身(検索範囲)の記述は省略します。
@result = @search.result(distinct: true)
@check = params[:q]

controller側に上記のように記述されているとして、(必要に応じて以下変更要)

-hoge→検索結果を出すページのアクション
-Post→検索したいモデル
-@search→検索内容をいれたローカル変数
-@result→検索結果をいれたローカル変数
-@check→検索範囲をいれたローカル変数

検索結果表示画面.html
<% if @check.present? %><!-- ここが重要 -->

      <% @result.each do |result| %>
    <!-- 中略 -->
      <% end %>

<% else %><!-- ここが重要 -->
<% end %><!-- ここが重要 -->

上記のように、通常の検索結果表示のための記述を
<% if @check.present? %><% else %>で挟みます。
ここまでで、もし検索条件には当てはまるものがあれば表示となり、
続く<% else %><% end %>により、当てはまらなければ何も表示しないとなります。

これだけ!

参考ページ

.present?のあたりの使い方については、こちらが参考になります。
https://qiita.com/somewhatgood@github/items/b74107480ee3821784e6