Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何正确检查ruby中的嵌套值_Ruby On Rails_Ruby_If Statement - Fatal编程技术网

Ruby on rails 如何正确检查ruby中的嵌套值

Ruby on rails 如何正确检查ruby中的嵌套值,ruby-on-rails,ruby,if-statement,Ruby On Rails,Ruby,If Statement,我有一个ruby哈希,如下所示: payload = { "fields" => { "publishedDate" => { "de"=>"2019-05-02T00:00+02:00" } } } 所以现在我想访问日期。如何高效、正确地编写if语句来检查日期是否存在 我目前正在做类似的事情,但不知怎么的,我觉得代码太多了: payload["fie

我有一个ruby哈希,如下所示:

payload = {
  "fields" => {
    "publishedDate" => {
      "de"=>"2019-05-02T00:00+02:00"
    }
  }
}
所以现在我想访问日期。如何高效、正确地编写if语句来检查日期是否存在

我目前正在做类似的事情,但不知怎么的,我觉得代码太多了:

payload["fields"] && payload["fields"]["publishedDate"] && payload["fields"]["publishedDate"].first && payload["fields"]["publishedDate"].first.last

谢谢你帮助我

假设日期始终是值(以
de
为例),则可以使用访问每个
publishedDate
,然后对每个哈希/值使用to和
any(&:present?
),以检查给定值中是否有一个不是空的:

在散列中不存在字段和/或publishedDate的最终情况下,它将返回nil,并且您将使用{}来调用值,从而生成一个不存在值的空数组

如果散列来自一个请求参数,那么您必须知道Rails在对象上通过访问调用
,并且您的散列键也可以作为符号访问,因此您可以执行以下操作:

(payload.dig(:fields, :publishedDate) || {}).values.any?(&:present?)
您可以将该方法用于。它还将简化您更高级的需求

(payload.dig('fields', 'publishedDate') || {}).values_at('de').any?(&:present?)
通过上述解决方案,您还可以验证特定密钥。您还可以在方法的值中包含多个键,如

(payload.dig('fields', 'publishedDate') || {}).values_at('de', 'month', 'year').any?(&:present?)

. 这应该会有所帮助。您必须执行类似于
payload.fetch(:fields,{}).fetch('publishedDate',{})
之类的操作,我不知道dig,但这正是我要找的。非常感谢你,塞巴斯蒂安!是否有一种方法可以挖掘不同的键,如publishedDate和publishAt?或者我真的需要使用多个DIG吗?非常感谢。您可以将
dig('fields')
存储在一个变量中,然后检查它们是否存在于哈希中,不过如果您要传递单个
键,最好使用
[]
(payload.dig('fields', 'publishedDate') || {}).values_at('de', 'month', 'year').any?(&:present?)