今回はAPIを開発していきます!早速本題。
設定
こちらを見ながらやっていこう、、
と思ったら、そもそもRailsのプロジェクト作成時ににAPIに不要な機能を除外できるオプションがあるらしい!まじか、適当に作っちゃったよ。
既存のプロジェクトをAPI専用に変更もできるらしいので、こちらの手順でやってみます。
config/application.rb
のApplication
クラス定義の冒頭に以下の設定を追加すればクラス生成やら利用モジュールやらがAPI用になるらしいです。
config.api_only = true
次に、デバッグ情報をAPIに出力するようconfig/environments/development.rb
に設定追加します。
config.debug_exception_response_format = :api
あとは、app/controllers/application_controller.rb
にて、クラス継承元をActionController::API
に変えればいいみたいです。config変えたから次作るControllerからは勝手にこうなるっぽい。
class ApplicationController < ActionController::API
end
ミドルウェアの追加は必要次第やることにします。
ルーティング
ルーティングはこれを見つつ、こちらの記事も参考に、namespaceとresourcesを使っていい感じに書きます。
resourcesはよく使う複数のルーティングを一行で書けるらしい。便利。ルーティングがどうなっているかはhttp://localhost:{ポート番号}/rails/info/routes
で一覧表示できます。
Rails.application.routes.draw do
namespace :api, format: 'json' do
namespace :v1 do
resources :tasks
resources :users
resources :login
end
end
end
Controllerの作成
$ rails generate controller Tasks
このようなコマンドでcontrollerファイルを生成することができます。
中身はとりあえず適当なjsonを返すだけ。
render json: result;
は、return render json: result;
の省略らしいです。
module Api
module V1
class TasksController < ApplicationController
def index
result = {taskId: 1, name: 'メール返信', limit: '2023-03-07 00:00:00', priority: 'MIDDLE'}
render json: result;
end
end
end
end
モジュール名を設定しないと
uninitialized constant Api::V1::TasksController
というエラーが返却されてきました。この文言自体は対象のコントローラーが見つからないという意味みたいです。モジュール名書いて解決!
で、Rubyのモジュールってなんですか? という話。
リファレンスマニュアルをからは、クラスと大体同じように見えます。
↓先人の知恵に頼ります。
クラス・モジュールの概念 Ruby
RubyのModuleの使い方とはいったい
今回ハマった例のように名前空間として使う用法と、メソッドの置き場所として使う用法があるみたいです。後者は、PHPとかでいう静的メソッドの呼び出しみたいに使えるのかな?という感じ。
呼び出してみる
安定と信頼のPostmanで呼び出してみます。
無事返ってきました!やったね!
パラメータを受け取る
こちらによると、
params[:param_name]
でクエリパラメータもPOSTで渡されたパラメータも、更にはルーティングで指定したパラメータ(/hoge/fuga/:idみたいなやつ)も全部取れるらしいです。便利〜。
というわけで呼び出し編はここまで!残りの部分は3分クッキング的に作っておきますので。。
次回予告
次回はDBを使っていきたいと思います。
元がMVCフレームワークだし、Modelとか使いやすそうで期待大です!
DDDっぽいのは向いていないという噂を聞いたのでデータベース準拠でやっていくのがいいのかな?というあたりの疑問についても調査したいと思います。がんばるぞい!