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