我正在为REST API开发一个Ruby绑定,并且正在努力解决那些被认为是惯用Ruby的问题。
为了举例说明,API表示的资源形成了树结构:
root
/\
/ \
/ \
group group
/ /\
/ / \
/ / \
project project project
要创建子项的新实例,需要了解其父项。例如,要创建一个新组,它必须具有root权限,以便它可以从根目录中检索用于创建组的URI。
我对阅读权限非常满意:
api = Api.new(...)
api.groups # An array of all groups
api.groups.select(...).projects # An array of all a group's projects
它正在创造我不确定的新资源。
我考虑过在数组子类上使用create方法:
group = api.groups.create("group-name")
project = group.projects.create("project-name")
直接实例化类型,将父类作为构造函数参数:
group = Group.new(api, "project-name")
project = Project.new(group, "project-name")
在父级上创建方法:
group = api.create_group("group-name")
project = group.create_project("project-name")
在上述三种方法中,我更喜欢第一种方法,因为它简洁,并允许创建链接。第三个选项是类似的,但它感觉不对 - 就REST API而言,创建发生在错误的级别,因为它是允许创建组的组资源。也就是说,我不是一个经验丰富的Ruby开发人员,首先,我希望Ruby API对Ruby开发人员来说是惯用的,即使这意味着它与REST API的模型不完全匹配。
答案 0 :(得分:0)
我不清楚代码示例和描述是如何与REST相关联的,但我会根据我的理解提供两分钱:
我认为使用这三者的组合是完全有效的。至于什么是惯用的,我会从Rails association methods获取你的线索。
api.groups.create
遵循Rails的has_many
语法。 api.create_group
和group.create_project
遵循has_one
语法。而且我假设,在create
/ create_association
的句法糖之下,你正在使用合成将所有类的引用绑定在一起,所以Group.new(api, "group-name")
/ {{1}似乎也是完全有效的选项。没有规则说你不能使用这三种方法来达到良好的效果(和Rails一样)。
我建议避免继承Ruby的基类(你提到子类化Array),除非你有充分的理由这样做。只需使用组合物在必要时委托给他们。