ruby-on-rails - 如何在不重复 nil 检查的情况下避免嵌套哈希中缺少元素的 NoMethodError?

标签 ruby-on-rails ruby hash hash-of-hashes

我正在寻找一种避免在深度嵌套的哈希中的每个级别检查 nil 的好方法。例如:

name = params[:company][:owner][:name] if params[:company] && params[:company][:owner] && params[:company][:owner][:name]

这需要三项检查,并且代码非常丑陋。有什么办法可以解决这个问题?

最佳答案

引入了 Ruby 2.3.0 a method called digHashArray 上。

name = params.dig(:company, :owner, :name)

如果在任何级别缺少 key ,它返回 nil

如果您使用的 Ruby 版本早于 2.3,您可以安装 ruby_dighash_dig_and_collect 等 gem,或者自己实现功能:

module RubyDig
  def dig(key, *rest)
    if value = (self[key] rescue nil)
      if rest.empty?
        value
      elsif value.respond_to?(:dig)
        value.dig(*rest)
      end
    end
  end
end

if RUBY_VERSION < '2.3'
  Array.send(:include, RubyDig)
  Hash.send(:include, RubyDig)
end

关于ruby-on-rails - 如何在不重复 nil 检查的情况下避免嵌套哈希中缺少元素的 NoMethodError?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4371716/

相关文章:

ruby-on-rails - 如何在 ERB 中转义 ERB 标签

ruby-on-rails - 如何从 Rails API 返回图像?

ruby-on-rails - 终结者找不到 Rails

ruby-on-rails - rails : What is the location option for in the render method

ruby-on-rails - 延迟作业未知属性错误

perl - 从嵌套哈希中查找值

javascript - jQuery/JavaScript : Changing URL hash from &lt;input&gt; tag or on form submit

php - 在数据库中存储登录信息的方法

ruby-on-rails - 创建中的 Rails 4 错误 "param is missing or the value is empty:"

ruby-on-rails - 方法定义名称开头的竖线字符有何作用