はじめに
ruby on railsでRESTfulなapiを作成するのにgrapeを使った際に
apiのversionを管理する方法について書きます。
要件
- ディレクトリでversion毎のコードを分けたい。(写真参照)
- モジュールの設定をなるべくわかりやすくしたい。
 
実現方法概要
- MyAPIモジュールというapiを管理するモジュール
- MyApi::API(api.rb)というクラスをベースとして、v1やv2をマウントする。
- MyApi::APIクラスにて共通の処理をヘルパーに入れる。
- v1.rb or v2.rbでそれぞれのバージョンで利用するapiをマウントする。
- /v1 or /v2にそれぞれのバージョンで使うapiのソースコードを置く
ソース
config/routes.rb
Rails.application.routes.draw do
  mount MyApi::API => '/'
end
app/api/my_api/v1(v2).rb
module MyApi
  class V1 < Grape::API
    prefix 'api'
    format :json
    default_format :json
    version 'v1', using: :path
    default_error_status :'500'
    mount Dummy
  end
end
app/api/my_api/v1(v2)/dummy.rb
class MyApi::V1::Dummy < Grape::API
  #http://qiita.com/yimajo/items/d4f484deda7cb9f61a49
  format :json
  resource :versions do
    get do
      'version 1'
    end
  end
end
注意点
注意点というか、まだrails始めたばかりでモジュールとかよくわかってなくてハマったこと。
モジュール構造はディレクトリ構造と紐づけないと動かない。
例えば、上記においてmy_apiディレクトリを用意せずその他すべてを/app/api直下に置いた場合
uninitialized constant MyApi (NameError)
というエラーで$rails sがエラーになる。
モジュールとかの参考ページ