今やっているバイトでfast_json_apiというgemを使ってRailsAPI serverから返すresponseをmodel serializerに記述しています。
fast_json_apiを使うことで
- responseが早くなる
- 統一されたresponseを開発者間で共有できる
- table columnの追加があった時に、変更が楽
などのメリットがあります。
使うタイミング
def create
@book = Book.new(create_params)
if @book.save
render ...
else
render エラーレスポンスを返したい
end
end
RailsAPI serverでCRUD処理を書いていると、上のような条件分岐をすることがあります。
その時にエラーの内容をjson_apiの仕様に基づいて返したいという動機が生まれました。
作ったコード
class ErrorSerializer
def initialize(model)
@model = model
end
def serialized_json
error_json = @model.errors.messages.map do |field, err_msgs|
err_msgs.map do |err_msg|
{
source: { pointer: "/data/attributes/#{field}" },
detail: err_msg
}
end
end
{ erros: error_json.flatten }
end
end
json_apiのエラーの仕様によると、
HTTP/1.1 422 Unprocessable Entity
Content-Type: application/vnd.api+json
{
"errors": [
{
"status": "422",
"source": { "pointer": "/data/attributes/firstName" },
"title": "Invalid Attribute",
"detail": "First name must contain at least three characters."
}
]
}
のように
{
"errors": ...
}
の形になっている必要があります。