ulmic/tramway-dev

View on GitHub
tramway-api/app/serializers/tramway/api/v1/error_serializer.rb

Summary

Maintainability
A
1 hr
Test Coverage
# frozen_string_literal: true

class Tramway::Api::V1::ErrorSerializer < ActiveModel::Serializer
  # Based on https://github.com/rails-api/active_model_serializers/blob/master/lib/active_model/serializer/error_serializer.rb
  # @return [Hash<field_name,Array<error_message>>]
  def as_json
    error_messages(object)
  end

  def success?
    false
  end

  private

  def error_messages(object, path = []) # rubocop:disable Metrics/AbcSize, Metrics/MethodLength
    error_messages = {}

    if object.respond_to? :errors
      object.errors.messages.each do |name, messages|
        error_messages.merge!((path + [name]).join('/') => messages)
      end
    end

    if object.respond_to? :model
      if object.model
        object.model.errors.messages.each do |name, messages|
          error_messages.merge!((path + [name]).join('/') => messages)
        end
      end

      object.model&.attributes&.each do |attribute_key, attribute_value|
        if attribute_value.is_a?(Array)
          attribute_value.each_with_index do |array_attribute_value, array_attribute_key|
            error_messages.merge!(
              error_messages(
                array_attribute_value,
                path + [attribute_key] + [array_attribute_key]
              )
            )
          end
        end
      end
    end

    error_messages
  end
end