在对象初始化时在ruby中动态构建访问器

大卫·盖斯玛(David Geismar)

我围绕JSON API创建了一个ruby包装器,该包装将json格式的响应转换为ruby对象。一个典型的资源如下所示:

module Learning360
  class User
    attr_accessor(
      :_id,
      :mail,
      :firstName,
      :lastName,
      :assignedPrograms,
      :paths,
      :certifications,
      :championAchievements,
      :comments,
      :completedPrograms,
      :groups,
      :imageUrl,
      :labels,
      :lastLoginAt,
      :championStatus,
      :learnerAchievements,
      :managers,
      :messages,
      :publications,
      :reactions,
      :skills,
      :subordinates,
      :toDeactivateAt,
      :totalTimeSpentInMinutes,
      :custom
    )

    def initialize(options = {})
      options.map { |(k, v)| send("#{k}=", v) }
    end
  end
end

当我收到JSON有效负载时,将其作为选项的哈希传递给初始化程序,然后将每个键的值分配为实例变量。只要我维护的更新列表,此方法就可以很好地工作attr_accessor但是,如果API决定更改其键的名称或添加新的键,则会抛出一个

undefined method `unexpected_key_from_api=' for #<Learning360::User>

如何避免该问题并使包装器更坚固。我希望包装对象仅从响应中获取任何键,如果不存在则自动构建相应的访问器。

萨巴达特

您可以attr_accessorinitialize方法内部创建属性您只需要像下面这样达到它:

module Learning360
  class User
    def initialize(options = {})
      options.each do |(k, v)|
        self.class.attr_accessor(k)
        send("#{k}=", v)
      end
    end
  end
end

user = Learning360::User.new({ name: "Matz" })
puts user.name  # Matz

也可以像一样直接使用类名User.attr_accessor(k)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在对象初始化时在ruby中动态构建访问器

来自分类Dev

在重新渲染过程中,对象属性值在对象初始化时未更新

来自分类Dev

C#初始化get访问器中的对象

来自分类Dev

动态使用对象初始化器

来自分类Dev

在对象初始化器中使用“ this”

来自分类Dev

在对象初始化程序中处理DBNull

来自分类Dev

如何在初始化时将不同数量的对象包括在初始化列表中?

来自分类Dev

未在Ruby中初始化的对象

来自分类Dev

未在Ruby中初始化的对象

来自分类Dev

初始化时出现Rails / ruby错误

来自分类Dev

初始化时如何动态设置Vuex中的初始状态(使用“if”)?

来自分类Dev

在对象初始化之前访问C ++ std :: vector对象成员

来自分类Dev

为什么在对象初始化时可以通过赋值运算符将参数传递给构造函数?

来自分类Dev

初始化时Ruby Prime对象是否带有固定数量的质数?

来自分类Dev

在其他代码初始化器中访问一个类的对象

来自分类Dev

初始化时如何在类的构造函数调用中容纳InputStream对象的FileInputStream对象?

来自分类Dev

初始化时如何在类的构造函数调用中容纳InputStream对象的FileInputStream对象?

来自分类Dev

动态初始化对象

来自分类Dev

动态初始化对象

来自分类Dev

如何在初始化时使用可变参数来在初始化时包括不同数量的对象?

来自分类Dev

初始化后访问Ruby中的变量

来自分类Dev

在Ruby模块中动态创建访问器

来自分类Dev

OpenCL-C ++包装器-动态库中的上下文取消初始化会导致访问冲突

来自分类Dev

python 3.8-在初始化时动态设置类的属性

来自分类Dev

使用动态url初始化时保存骨干模型

来自分类Dev

动态创建类时初始化时出错

来自分类Dev

要释放动态数组初始化时程序崩溃

来自分类Dev

如何访问在构造函数(JAVA)中初始化的对象?

来自分类Dev

手动引导/初始化时访问Angular服务

Related 相关文章

  1. 1

    在对象初始化时在ruby中动态构建访问器

  2. 2

    在重新渲染过程中,对象属性值在对象初始化时未更新

  3. 3

    C#初始化get访问器中的对象

  4. 4

    动态使用对象初始化器

  5. 5

    在对象初始化器中使用“ this”

  6. 6

    在对象初始化程序中处理DBNull

  7. 7

    如何在初始化时将不同数量的对象包括在初始化列表中?

  8. 8

    未在Ruby中初始化的对象

  9. 9

    未在Ruby中初始化的对象

  10. 10

    初始化时出现Rails / ruby错误

  11. 11

    初始化时如何动态设置Vuex中的初始状态(使用“if”)?

  12. 12

    在对象初始化之前访问C ++ std :: vector对象成员

  13. 13

    为什么在对象初始化时可以通过赋值运算符将参数传递给构造函数?

  14. 14

    初始化时Ruby Prime对象是否带有固定数量的质数?

  15. 15

    在其他代码初始化器中访问一个类的对象

  16. 16

    初始化时如何在类的构造函数调用中容纳InputStream对象的FileInputStream对象?

  17. 17

    初始化时如何在类的构造函数调用中容纳InputStream对象的FileInputStream对象?

  18. 18

    动态初始化对象

  19. 19

    动态初始化对象

  20. 20

    如何在初始化时使用可变参数来在初始化时包括不同数量的对象?

  21. 21

    初始化后访问Ruby中的变量

  22. 22

    在Ruby模块中动态创建访问器

  23. 23

    OpenCL-C ++包装器-动态库中的上下文取消初始化会导致访问冲突

  24. 24

    python 3.8-在初始化时动态设置类的属性

  25. 25

    使用动态url初始化时保存骨干模型

  26. 26

    动态创建类时初始化时出错

  27. 27

    要释放动态数组初始化时程序崩溃

  28. 28

    如何访问在构造函数(JAVA)中初始化的对象?

  29. 29

    手动引导/初始化时访问Angular服务

热门标签

归档