Techioz Blog

Ransack: フォームが送信され、検索値が入力されなかった場合、何も返されません

概要

検索フォームと検索結果を同じページに掲載しています。

私の理解では、ransack のデフォルトでは、検索フィールドに値を入力せずにフォームが送信された場合、その特定のリソースのすべてのレコードが返されます。

ユーザーが検索フィールドに値を入力しない検索を行った場合にレコードが返されないように変更するにはどうすればよいですか?

ランサックのドキュメント

これは機能しません:

if params["q"].values.present? # Always returns true because an array of empty strings returns true from method call: present?
  # do this
else
  # do that
end

これも同様ではありません:

if params["q"].values.empty? # Always returns true because an array of empty strings returns true from method call: empty?
  # do this
else
  # do that
end

params[“q”].present を確認していますか?フォームが送信されるたびに、値が入力されているかどうかに関係なく、これがサーバーに渡されるため、これも機能しません。

# showing with pry
[1] pry> params[:q] 
  => {"namesearch_start"=>"",
      "city_cont"=>"",
     }
[2] pry> params[:q].present?
  => true # always returns true

したがって、params[“q”] は、値が入力されているかどうかに関係なく、常に存在します。

解決策

できることは、空白の値を拒否することです。

if params[:q].reject { |_, v| v.blank? }.any? # .none? for inverted
  # Handle search
else
  # Handle no query scenario
end

または

if params[:q].values.reject(&:blank?).any? # .none? for inverted
  # Handle search
else
  # Handle no query scenario
end