0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

fast_json_apiでErrorSerializerを作った

Posted at

今やっているバイトで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": ...
}

の形になっている必要があります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?