Rails API отображает все ответы в camelCase - PullRequest
0 голосов
/ 17 марта 2019

Я пытаюсь заставить мой Rails API отображать все ответы JSON в camelCase. В настоящее время я использую Netflix Fast JSON API для своего сериализатора и выдаю ошибки, например:

render json: { errors: command.errors }, status: :unauthorized

Для сериализаторов Netflix Fast JSON API я добавляю set_key_transform :camel_lower к каждому сериализатору, что, кажется, делает свое дело (хотя, если кто-нибудь знает, как сделать это значением по умолчанию, это будет очень полезно).

Однако при ошибках рендеринга я не уверен, что лучше всего использовать верблюжью оболочку. Если у кого-то есть опыт в этом, пожалуйста, дайте мне знать, как вы это делаете! В идеале есть способ сделать это, который не добавляет слишком много синтаксиса к каждому выполняемому вызову рендеринга.

UPDATE

При сериализации ошибок я добавил вспомогательный метод на контроллере приложения:

def render_error(errors_params, status)
  render json: {
    errors: errors_params
  }.deep_transform_keys { |key| key.to_s.camelize(:lower) }, status: status
end

Для Netflix Fast JSON API я воспользовался предложением @spickermann и добавил сериализатор приложения для других сериализаторов, чтобы наследовать от него:

class ApplicationSerializer
  include FastJsonapi::ObjectSerializer
  set_key_transform :camel_lower
end
class SomeSerializer < ApplicationSerializer
  attributes :attribute, :other_attribute
end

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Вы можете установить патч на сериализаторе

Rails.application.config.to_prepare do
  FastJsonapi::ObjectSerializer.class_eval do
    set_key_transform :camel_lower
  end
end

и для обработки ошибок вы, вероятно, можете создать сериализатор ошибок

render serializer: ErrorSerializer, json: {status: : unauthorized, errors: resource.errors 

Посмотрите здесь и здесь

1 голос
/ 17 марта 2019

Вы можете создать ApplicationSerializer, и все другие сериализаторы могут наследовать от него:

class ApplicationSerializer
  include FastJsonapi::ObjectSerializer
  set_key_transform :camel_lower
end

class FooBarSerializer < ApplicationSerializer
  attributes :buzz, :fizz 
  # ...
end
...