Ransack:提交表单且未输入搜索值时不返回任何内容

问题描述 投票:0回答:2

我将搜索表单和搜索结果发布在同一页面上。

据我了解:搜查的默认设置是,如果提交的表单没有在搜索字段中输入任何值,则返回该特定资源的所有记录。

如何更改它,以便如果用户在搜索字段中未输入任何值进行搜索,则不会返回 none 记录?

搜查文档

这不起作用:

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"]
将始终存在。

ruby-on-rails ruby ransack
2个回答
2
投票

您可以做的就是拒绝任何空白值。

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

0
投票

我知道这很旧,但这里有一个替代方案:

ransack 方法返回 Search 类的新实例,https://github.com/activerecord-hackery/ransack/blob/main/lib/ransack/adapters/active_record/base.rb

查看 Search 类,https://github.com/activerecord-hackery/ransack/blob/main/lib/ransack/search.rb,我们看到检查方法被重写以创建更好的表示目的。该表示形式包括基于任何作用域参数的条件。

因此,如果您使用 @q 作为资源,如文档中所述:

    @q = MyModel.ransack(params[:q])

您可以检查它是否有范围或条件,包括:

    @q.inspect.include?('scope') || @q.inspect.include?('conditions')

或正则表达式

    @q.inspect.match?(/scope|conditions/)

无搜索和空搜索都将计算为 false,因为两者都没有范围或条件参数。

另外,当我们使用实例变量时,我们可以在控制器和视图中使用此检查。

© www.soinside.com 2019 - 2024. All rights reserved.