如何使用多个{‘not found’}干扰方法?

我正在尝试优雅地处理以下错误的JSON,其中Hash#fetch似乎不是一个选项( 使用Hash #fetch优雅地处理错误的JSON ):

实时应用: http : main_controller.rbmain_controller.rb

显然,最好的方法是在每个参数的末尾添加{ 'not found' }

 mashie.products.each do |product| product.extend Hashie::Extensions::DeepFetch product.name = product.deep_fetch :name { 'not found' } product.brand = product.deep_fetch :brand, :name { 'not found' } product.price = product.deep_fetch :sale_price { 'not found' } product.currency = product.deep_fetch :currency { 'not found' } @products << product end 

但有没有办法干这个?

编辑:根据与@dax的讨论更新

我不确定product.price = product.deep_fetch(attribute, { 'not found' })正确语法:

 mashie.products.each do |product| product.extend Hashie::Extensions::DeepFetch i%[name sale_price currency].each do |attribute| product.price = product.deep_fetch attribute { 'not found' } end @products << product end 

根据评论中的澄清,我也会回答。 我的解决方案与Зелёный的解决方案大致相同,但它需要考虑动态属性设置

 mashie.products.each do |product| product.extend Hashie::Extensions::DeepFetch i%[name sale_price currency].each do |attribute| value = product.deep_fetch attribute { 'not found' } product.send("#{attribute}=", value) end @products << product end