やりたいこと
railsでのAPI作成の学習のためにgrapeを使ってかんたんなAPIを作る。
学習のための備忘録。
手順
- grapeのインストール
- プロジェクト内にapiディレクトリを作成してルーティングを設定する
grapeのインストール
$ gem install grape
#or
$ emacs Gemfile
# grape を追加
$ bundle install
ディレクトリの構成
app
|- apis
|- api
|-v1
みたいな感じで構成
grapeはapi周りのファイルをapp以下のapiというディレクトリにいれる。
上記のようなディレクトリ構成とroutingのためのroot.rbをapiディレクトリとapiのバージョンのディレクトリに作成する。
まずはapiディレクトリ配下のファイルを読み込むためにオートローディングの設定を行い、その後、/apiのURLをapiディレクトリに合わせる設定を行う
# 以下二行を追加。やっていることはpathの追加とautoloadの設定
config.paths.add File.join('app', 'apis'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'apis', '*')]
これでAPIというモジュールが動作します。
Rails.application.routes.draw do
mount API::Root => '/api' # 追加
end
/apiというURLが呼ばれた際はapis/api以下のファイルが呼ばれます。
使用するAPIを指定するために、api以下のディレクトリをマウントします。
module API
class Root < Grape::API
mount API::V1::Root
end
end
最後にv1以下のルーティングを呼ぶ設定をします。
module API
module V1
class Root < Grape::API
version 'v1', using: :path
format :json
get '/' do
puts 'test'
end
end
end
end
domain/api/v1を実行して、コンソールに'test'が表示されればOK。
#はまったところ。
最初以下のようなディレクトリ構成にしていたらNameMethodエラーが起きてしました。
route.rbでapiディレクトリのroot.rbを指定してたのですが、APIがそもそもインスタンス化されいない?というエラーが出てしまい思いっきりハマりました。
最初のオートロード設定
config.paths.add File.join('app', 'api'), glob: File.join('**', '*.rb')
config.autoload_paths += Dir[Rails.root.join('app', 'api', '*')]
最初のディレクトリ構成
app
|- api ←ここにオートロードがあっていない。
|-v1
これでUninitialized constant API
エラーが発生してしまってました。
原因と解決策なのですが、app以下のapi関連のファイルを入れるディレクトリの階層を現在と同じにしたら解消しました。
autoloadingの設定あたりがうまく行ってなかったのかなーと思ったんですが、apiに関連するファイルするディレクトリの階層と名前空間?の関連性がいまいち理解できていなかったのが原因だったのかなと。