はじめに
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
がエラーになる。
モジュールとかの参考ページ