代码之家  ›  专栏  ›  技术社区  ›  vinibrsl

如何正确版本Ruby on Rails API?

  •  0
  • vinibrsl  · 技术社区  · 8 年前

    在讨论Ruby on Rails API版本控制时,通常会在控制器级别创建一个分区。他们在不同的模块中使用新的控制器创建新的路由,例如 API::V2::ProductsController 等等

    问题是:并非所有代码都在控制器中 .即使是一个简单的Ruby on Rails应用程序,其代码也在模型、视图(在本例中是序列化程序)和控制器之间共享。更不用说作业、邮件程序和特定于应用程序的库(lib/directory)代码了。

    即使使用具有不同路由的新控制器对控制器进行版本设置,每个版本的模型都是相同的,视图和数据库模式本身也是一样的。

    我知道ActiveModelSerializer是最常用的序列化gem之一,它确实实现了版本控制,但Rails模型默认情况下不支持版本控制。

    有没有办法真正实现Ruby on Rails API的版本化?

    1 回复  |  直到 8 年前
        1
  •  1
  •   RyanWilcox    8 年前

    我会说你的视图层:你的序列化程序或 .rabl .jbuilder 文件应该包含尽可能多的表示逻辑(最好是全部!)。因此,这些数据是如何向用户显示的:一个格式很好的字符串,一个具有特定结构的JSON文档,一个结构稍有不同的JSON文档。

    如果您有一个用户模型,并且希望格式化用户加入网站的日期,请不要实现 User#dateUserJoinedISOStr 方法,而是在序列化程序中获取日期字段,并在那里对适当的iso字符串进行转换。

    然后,您可以打开请求的API版本,或者如果两个API版本之间的更改太不同,则使用完全不同的序列化程序。

    从理论上讲,您甚至可以将两个api版本视为同一资源的不同表示形式,并使用/滥用Rails内容类型格式工具来选择正确的内容模板。

    如果你有一个既返回HTML又返回JSON(或者更好地说,是“JSON表示之外的HTML表示”)的网站,这当然会变得更加困难。在这种情况下,我要么使用一些聪明的路线魔法,使版本通过 params 或者稍微改变一下惯例,不要在URL路径中添加版本号(而是使用标题!)。无论如何,如果路由总是去同一个地方,那么要么在控制器中有一些if语句(以选择正确的版本序列化程序),要么在序列化程序中有一堆if语句(“现在显示还是不显示?”)。