# Maintaining multiple API versions

**URL:** <https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394>\
**Category:** Rails\
**Created:** [September 12, 2009, 4:16pm UTC](https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394 "2009-09-12T16:16:37Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![arvias](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/ac91a4/32.png) [@arvias](https://www.ruby-forum.com/u/arvias)\
**Post date:** [September 12, 2009, 4:16pm UTC](https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394/1 "2009-09-12T16:16:37Z")

</div>

Hi.

What’s beautiful about Rails is that it provides the incredibly easy  
system for API building.

At the same time once you grow and production test the application you  
start finding that you can make the API interface even better. But you  
have to break backward compatibility.

How do you handle this situation?

I was initially planning something like DNS versioning and multiple  
rails deployments ([api01.startup.com](http://api01.startup.com), [api05.startup.com](http://api05.startup.com)). This plan  
won’t work anymore since there are cases when we will controlling the  
code, but not the deployment server and DNS setup.

What’s the best way to implement API versioning in rails?

–  
M.

---

<div class="post-metadata">

**Author:** ![arvias](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/ac91a4/32.png) [@arvias](https://www.ruby-forum.com/u/arvias)\
**Post date:** [September 13, 2009, 1:23am UTC](https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394/2 "2009-09-13T01:23:12Z")

</div>

> What’s the best way to implement API versioning in rails?

With routing.

Start off with [api.startup.com/v1/session/create](http://api.startup.com/v1/session/create), then move on to  
[api.startup.com/v2/session/create](http://api.startup.com/v2/session/create), etc.

- D

---

<div class="post-metadata">

**Author:** ![arvias](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/ac91a4/32.png) [@arvias](https://www.ruby-forum.com/u/arvias)\
**Post date:** [September 13, 2009, 10:53pm UTC](https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394/3 "2009-09-13T22:53:47Z")

</div>

> What’s the best way to provide backwards compatibility using this  
> model? Should I have XML views that implement:  
> if version1  
> do this  
> else  
> do that

I like to avoid code in views- how about separate templates, like  
app/views/session/v1/create.xml.erb and  
app/views/session/v2/create.xml.erb?

- D

---

<div class="post-metadata">

**Author:** ![arvias](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/ac91a4/32.png) [@arvias](https://www.ruby-forum.com/u/arvias)\
**Post date:** [September 13, 2009, 5:58pm UTC](https://www.ruby-forum.com/t/maintaining-multiple-api-versions/175394/4 "2009-09-13T17:58:15Z")

</div>

> With routing.
> 
> Start off with [api.startup.com/v1/session/create](http://api.startup.com/v1/session/create), then move on to  
> [api.startup.com/v2/session/create](http://api.startup.com/v2/session/create), etc.

Interesting. That would be a pretty solution.

What’s the best way to provide backwards compatibility using this  
model? Should I have XML views that implement:  
if version1  
do this  
else  
do that

–  
M.
