我会说你的视图层:你的序列化程序或
.rabl
或
.jbuilder
文件应该包含尽可能多的表示逻辑(最好是全部!)。因此,这些数据是如何向用户显示的:一个格式很好的字符串,一个具有特定结构的JSON文档,一个结构稍有不同的JSON文档。
如果您有一个用户模型,并且希望格式化用户加入网站的日期,请不要实现
User#dateUserJoinedISOStr
方法,而是在序列化程序中获取日期字段,并在那里对适当的iso字符串进行转换。
然后,您可以打开请求的API版本,或者如果两个API版本之间的更改太不同,则使用完全不同的序列化程序。
从理论上讲,您甚至可以将两个api版本视为同一资源的不同表示形式,并使用/滥用Rails内容类型格式工具来选择正确的内容模板。
如果你有一个既返回HTML又返回JSON(或者更好地说,是“JSON表示之外的HTML表示”)的网站,这当然会变得更加困难。在这种情况下,我要么使用一些聪明的路线魔法,使版本通过
params
或者稍微改变一下惯例,不要在URL路径中添加版本号(而是使用标题!)。无论如何,如果路由总是去同一个地方,那么要么在控制器中有一些if语句(以选择正确的版本序列化程序),要么在序列化程序中有一堆if语句(“现在显示还是不显示?”)。