我围绕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_accessor
在initialize
方法内部创建属性。您只需要像下面这样达到它:
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] 删除。
我来说两句