【问题标题】:Ransack: return nothing when form submitted and no search values enteredRansack:提交表单且未输入搜索值时不返回任何内容
【发布时间】:2015-08-17 16:05:28
【问题描述】:

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

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

我该如何更改它,以便如果用户在搜索字段中未输入任何值的情况下进行搜索,则返回条记录?

Ransack Documentation

这不起作用:

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


    【解决方案1】:

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

    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
    

    【讨论】:

    • 这适用于第一个请求,但不幸的是对于所有其他请求它不起作用。示例:用户为字段输入foo 的搜索值并单击搜索。返回结果后,用户删除foo(现在没有搜索值)并再次单击搜索。 params[:q] 将出现,即使没有值,所以默认行为开始:返回所有记录。
    • present?blank 将检查密钥 是否有值,因此如果 params[:q] 为空,您将获得 false 对应的 present?true 代表blank?,您可以据此决定做什么。只有当条件返回所需的结果时,您才可以推迟 Ransack。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多