【问题标题】:Accessing object values that have reserved keywords as names in Rails在 Rails 中访问具有保留关键字作为名称的对象值
【发布时间】:2011-04-09 14:03:20
【问题描述】:

我正在使用 ruby​​-aaws gem 访问 Amazon AWS API,但没有详细介绍 API 或 gem,我认为我的问题更多的是一般性质。

当我查询 API 时,我最终会得到“对象数组”,我们称之为 item,其中包含 API 响应。 我可以轻松访问数组中的数据,例如puts item.item_attributes.artist.to_s

现在 API 返回标识符是 Rails 中的保留字的属性,例如格式绑定

这样做:
puts item.item_attributes.format.to_s 将返回 method not found


puts item.item_attributes.binding.to_s 将返回一些对象哈希,例如#<Binding:0xb70478e4>

我在做的时候可以看到那个名字下有值
puts item.item_attributes.to_yaml

生成的 yaml 显示的片段艺术家绑定
--- !seq:Amazon::AWS::AWSArray
- !ruby/object:Amazon::AWS::AWSObject::ItemAttributes
__val__:
artist: !seq:Amazon::AWS::AWSArray
- !ruby/object:Amazon::AWS::AWSObject::Artist
__val__: Summerbirds in the Cellar
binding: !seq:Amazon::AWS::AWSArray
- !ruby/object:Amazon::AWS::AWSObject::Binding
__val__: Vinyl

这可能是一个非常详细的解释,一个非常简单的解决方案,但我似乎找不到解决方案。

编辑
终于找到了。我想这是因为它是一个对象数组,呃...... puts item.item_attributes[0].binding.to_s

【问题讨论】:

  • item.binding 返回什么?
  • Object#binding 返回该对象的范围。那是 ruby​​,不是 rails。
  • item.binding 返回 nil。问题是我不能使用 item.item_attributes.binding 作为语法,因为 'binding' 是保留字。虽然没有像“艺术家”这样的词,但 item.item_attributes.artist 有效。

标签: ruby-on-rails ruby amazon-web-services


【解决方案1】:

您可以使用[] 而不是方法名称(无论如何可能使用method_missing 提供)来访问各个属性。

所以,item.item_attributes[:artist].to_s 可能会返回您想要的内容。如果不是,那么值得尝试将'artist' 作为密钥。

【讨论】:

  • 不工作错误信息是:`[]': Symbol as array index (TypeError)
  • 啊,看起来 item['artist'] 可以为所欲为。告诉我,我会更新我的答案。
  • 无济于事:`[]':无法将字符串转换为整数(TypeError)
【解决方案2】:

终于找到了。我猜是因为它是一个对象数组,呵呵……
puts item.item_attributes[0].binding.to_s

【讨论】:

    猜你喜欢
    • 2021-09-05
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2017-12-05
    • 2017-07-06
    • 1970-01-01
    • 2021-07-31
    • 1970-01-01
    相关资源
    最近更新 更多