mirror of
https://github.com/ditkrg/active_model_serializers.git
synced 2026-01-25 07:16:49 +00:00
Require explicit adapter/serializer to render JSON API errors
- Separate collection errors from resource errors in adapter - Refactor to ErrorsSerializer; first-class json error methods - DOCS - Rails 4.0 requires assert exact exception class, boo
This commit is contained in:
@@ -14,7 +14,9 @@ This is the documentation of ActiveModelSerializers, it's focused on the **0.10.
|
||||
- [Caching](general/caching.md)
|
||||
- [Logging](general/logging.md)
|
||||
- [Instrumentation](general/instrumentation.md)
|
||||
- [JSON API Schema](jsonapi/schema.md)
|
||||
- JSON API
|
||||
- [Schema](jsonapi/schema.md)
|
||||
- [Errors](jsonapi/errors.md)
|
||||
- [ARCHITECTURE](ARCHITECTURE.md)
|
||||
|
||||
## How to
|
||||
|
||||
57
docs/jsonapi/errors.md
Normal file
57
docs/jsonapi/errors.md
Normal file
@@ -0,0 +1,57 @@
|
||||
[Back to Guides](../README.md)
|
||||
|
||||
# JSON API Errors
|
||||
|
||||
Rendering error documents requires specifying the serializer and the adapter:
|
||||
|
||||
- `adapter: :'json_api/error'`
|
||||
- Serializer:
|
||||
- For a single resource: `serializer: ActiveModel::Serializer::ErrorSerializer`.
|
||||
- For a collection: `serializer: ActiveModel::Serializer::ErrorsSerializer`, `each_serializer: ActiveModel::Serializer::ErrorSerializer`.
|
||||
|
||||
The resource **MUST** have a non-empty associated `#errors` object.
|
||||
The `errors` object must have a `#messages` method that returns a hash of error name to array of
|
||||
descriptions.
|
||||
|
||||
## Use in controllers
|
||||
|
||||
```ruby
|
||||
resource = Profile.new(name: 'Name 1',
|
||||
description: 'Description 1',
|
||||
comments: 'Comments 1')
|
||||
resource.errors.add(:name, 'cannot be nil')
|
||||
resource.errors.add(:name, 'must be longer')
|
||||
resource.errors.add(:id, 'must be a uuid')
|
||||
|
||||
render json: resource, status: 422, adapter: 'json_api/error', serializer: ActiveModel::Serializer::ErrorSerializer
|
||||
# #=>
|
||||
# { :errors =>
|
||||
# [
|
||||
# { :source => { :pointer => '/data/attributes/name' }, :detail => 'cannot be nil' },
|
||||
# { :source => { :pointer => '/data/attributes/name' }, :detail => 'must be longer' },
|
||||
# { :source => { :pointer => '/data/attributes/id' }, :detail => 'must be a uuid' }
|
||||
# ]
|
||||
# }.to_json
|
||||
```
|
||||
|
||||
## Direct error document generation
|
||||
|
||||
```ruby
|
||||
options = nil
|
||||
resource = ModelWithErrors.new
|
||||
resource.errors.add(:name, 'must be awesome')
|
||||
|
||||
serializable_resource = ActiveModel::SerializableResource.new(
|
||||
resource, {
|
||||
serializer: ActiveModel::Serializer::ErrorSerializer,
|
||||
adapter: 'json_api/error'
|
||||
})
|
||||
serializable_resource.as_json(options)
|
||||
# #=>
|
||||
# {
|
||||
# :errors =>
|
||||
# [
|
||||
# { :source => { :pointer => '/data/attributes/name' }, :detail => 'must be awesome' }
|
||||
# ]
|
||||
# }
|
||||
```
|
||||
Reference in New Issue
Block a user