Skip to content

Commit 1659a62

Browse files
committed
Add support for ActiveModel::Errors.
1 parent dc373eb commit 1659a62

File tree

3 files changed

+52
-4
lines changed

3 files changed

+52
-4
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
module JSONAPI
2+
module Rails
3+
class ActiveModelError
4+
def initialize(field, message, source)
5+
@field = field
6+
@message = message
7+
@source = source
8+
9+
freeze
10+
end
11+
12+
def as_jsonapi
13+
{}.tap do |hash|
14+
hash[:detail] = @message
15+
hash[:title] = "Invalid #{@field}" unless @field.nil?
16+
hash[:source] = { pointer: @source } unless @source.nil?
17+
end
18+
end
19+
end
20+
21+
class ActiveModelErrors
22+
def initialize(errors, reverse_mapping)
23+
@errors = errors
24+
@reverse_mapping = reverse_mapping
25+
26+
freeze
27+
end
28+
29+
def to_a
30+
@errors.keys.flat_map do |key|
31+
@errors.full_messages_for(key).map do |message|
32+
ActiveModelError.new(key, message, @reverse_mapping[key])
33+
end
34+
end
35+
end
36+
alias to_array to_a
37+
end
38+
end
39+
end

lib/jsonapi/rails/railtie.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ class Railtie < ::Rails::Railtie
1111
MEDIA_TYPE = 'application/vnd.api+json'.freeze
1212
PARSER = JSONAPI::Rails.parser
1313
RENDERERS = {
14-
jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer),
15-
jsonapi_error: JSONAPI::Rails.rails_renderer(ErrorRenderer)
14+
jsonapi: JSONAPI::Rails.rails_renderer(SuccessRenderer),
15+
jsonapi_errors: JSONAPI::Rails.rails_renderer(ErrorsRenderer)
1616
}.freeze
1717

1818
initializer 'jsonapi-rails.action_controller' do

lib/jsonapi/rails/renderer.rb

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
require 'jsonapi/rails/active_model_errors'
12
require 'jsonapi/serializable/renderer'
23

34
module JSONAPI
@@ -16,9 +17,17 @@ def self.render(resources, options)
1617
end
1718
end
1819

19-
class ErrorRenderer
20+
class ErrorsRenderer
2021
def self.render(errors, options)
21-
# TODO(beauby): SerializableError inference on AR validation errors.
22+
errors = [errors] unless errors.is_a?(Array)
23+
errors = errors.flat_map do |error|
24+
if error.is_a?(ActiveModel::Errors)
25+
ActiveModelErrors.new(error, options[:_reverse_mapping]).to_a
26+
else
27+
error
28+
end
29+
end
30+
2231
JSONAPI::Serializable::ErrorRenderer.render(errors, options)
2332
end
2433
end

0 commit comments

Comments
 (0)