【问题标题】:How to check for the presence of no value in a "params[:attribute]"如何检查“params [:attribute]”中是否存在任何值
【发布时间】:2020-01-25 20:28:39
【问题描述】:

当我有一个这样的数组时:

[5] pry(#<HomeController>)> params["search"]["sources"] => [""]

如何检查该实例是否为真?

我尝试了以下方法,但失败了:

[8] pry(#<HomeController>)> params[:search][:sources].empty?
=> false
[9] pry(#<HomeController>)> params[:search][:sources].nil?
=> false
[3] pry(#<HomeController>)> params["search"]["sources"].empty?
=> false
[4] pry(#<HomeController>)> params["search"]["sources"].eql? ""
=> false
[10] pry(#<HomeController>)> params[:search][:sources].blank?
=> false
[11] pry(#<HomeController>)> params[:search][:sources].any?
=> true

每当我的params 的属性值为空或等于"" 时,我都想做一些具体的事情。

我希望它是 if 语句的条件,所以在上述情况下它必须返回 true。

这是我正在检查的实际完整的params

 params
=> <ActionController::Parameters {"search"=><ActionController::Parameters {"keywords"=>"", "types"=>[""], "categories"=>["", "", "", "", "", "", "", "Hockey", "", "", "", "", "", "", "", "", "", "", "", "", ""], "date_from"=>"", "date_to"=>"", "sources"=>[""], "genders"=>[""], "ages"=>[""]} permitted: false>, "controller"=>"home", "action"=>"index"} permitted: false>

基本上我想检查params[:search][:categories] 中的任何值是否不为空。在上面的例子中,我们看到其中一个值等于字符串Hockey,所以在这种情况下它应该返回false。

【问题讨论】:

  • 请不要使用“编辑 1”之类的标签。而是将添加内容纳入问题中,就好像它一直存在一样。如果我们需要知道,我们可以知道发生了什么变化。 “Should “Edit:” in edits be discouraged?”有助于解释。此外,params["search"]["sources"] =&gt; [""] 不是数组,而是对象转储。相反,我们需要实际的 Ruby 代码来定义数组并将其分配给 params

标签: ruby-on-rails ruby ruby-on-rails-6


【解决方案1】:

我可能会尽量避免检查两者——一个空白数组或一个只包含一个空字符串的数组。但如果我不得不这样做,我会明确表示:

array = params[:search][:sources]
array.blank? || array == ['']

另一个选项可能是:

params[:search][:sources].first.blank?

但我认为第二个选项更难理解(至少在所有会返回 true 的情况下)。

对于categories,条件是:

params[:search][:categories].any?(&:present?)

【讨论】:

  • 所以array.blank? 不起作用,但.first.blank? 可以......就像== [''] 一样。所以如果你修改答案的第一部分,我会接受。
  • 实际上...我将更新问题并向您展示我要检查的整个参数。
  • @marcamillion。我认为你需要两者。当数组为空 ([]) 时,array.blank? 返回 true,当数组仅包含空字符串 ([""]) 时,array == [''] 返回 true。我理解你想要涵盖这两种情况的问题。而对于两种情况([][""]),第二个选项将返回 true
  • 哦,这是一个很好的观点。在这种情况下你是对的。我如何处理更新的条件,这是我真正想要实现的?刷新问题以查看修改。
  • @marcamillion 我更新了我的答案以解决您更新的问题。
【解决方案2】:
params[:search][:sources].all?(&:blank?)

【讨论】:

  • 与其扔掉代码,不如解释一下为什么它是解决方案。我们想要教育,而不仅仅是解决眼前的问题。
猜你喜欢
  • 2019-03-19
  • 2015-08-14
  • 2012-08-04
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多