DJ System の API です。
必ずrackup
コマンドを使用してください。
$ git clone https://github.com/lit-kansai/dj_system-api
$ cd dj_system-api
$ bundle install
$ rake db:create
$ rake db:migrate
$ $EDITOR .env
$ rackup config.ru
SPOTIFY_API_CLIENT_ID=
SPOTIFY_API_CLIENT_SECRET=
GOOGLE_API_CLIENT_ID=
GOOGLE_API_CLIENT_SECRET=
JWT_SECRET=
CORS_DOMAINS=
APPLE_MUSIC_API_PRIVATE_KEY=
APPLE_MUSIC_API_KEY_ID=
APPLE_MUSIC_API_TEAM_ID=
目的 | 技術 | 備考 |
---|---|---|
言語 | Ruby | |
フレームワーク | Sinatra | 規模が大きいのでmodular styleを採用しています。 |
ORM | Active Record | |
サーバ | AWS EC2 |
Sinatra の modular style は通常Sinatra::Base
もしくはSinatra::Application
を継承したクラスを作成しますが、このプロジェクトでは Sinatra::Base
を継承して新たにBase
クラスを作り、こちらを使用しています。
これにより、全てのルートで共通な関数を定義したり、設定をすることが出来ます。
また、Base
クラスの中でもかなり特殊な(ある意味 Evil とも捉えられる)実装であるbind_router
メソッドについては次のセクションで解説しています。
このメソッドを理解するためには 2 つの前提を理解する必要があります。まず 1 つ目にSinatra::Base
クラスが Rack に準拠しており、call
メソッドを呼び出すことで Rack アプリケーションとして動作するようになっている事を知っておく必要があります。
そして、Rack アプリケーションとは、環境を引数として受け取り、status / header / body を返すメソッド「call」が定義されているクラスということになります。
つまるところ、Sinatra::Base
クラスはこの Rack アプリケーションの仕様に基づき、get
メソッドやpost
メソッドの定義を元にルーティングを処理し、その結果を Rack の形式に変換して返すという仕組みになっているということです。
2 つ目に、Ruby ではクラスの直下でメソッドを呼び出せるという仕様を知る必要があります。
この仕様についてはこちらの記事が参考になりますが、クラス直下に書いたメソッドはクラスが読み込まれたタイミングで呼び出されるという仕様になっています。
そして、実はget '/' do
のようなget
やpost
はこちらの仕組みが使われており、クラス直下でget
メソッドを呼び出しているということになります。
また、get
メソッドも Call メソッドと互換があるので、get
メソッドの引数に Rack アプリケーションを渡すことが出来ます。
これらを整理して、別のファイルを元にget
やpost
メソッドを呼び出せばいいのでは?と考えたのがこのbind_router
です。
bind_router
を呼び出すと、任意のパス配下の処理を別のクラスに委譲することが出来ます。また、@変数は維持されるので、bind_router
を呼び出す前に定義した変数をそのまま使うことが出来ます。
Sinatra が一部@env["PATH_INFO"]
を元に処理している部分があるため、ここだけ予め変更するように Proc を記述しています。
Sinatra は条件によっては上から優先して処理をしていく場合があるので、bind_router
は必ずクラス末尾に記述する必要があります。