Как мне заставить Rails 4 сериализовать ActiveModel JSON с вложенным корнем на настраиваемом сериализаторе? - PullRequest
0 голосов
/ 21 декабря 2018

В Rails 3 мое приложение сериализовало объекты ActiveModel с именем модели в качестве корня, например:

{
  "car": {
    "id":29,
    "make":"Kia",
    "model":"Optima" }
}

Который был настроен в:

#config/initializers/wrap_parameters.rb

ActiveSupport.on_load(:active_record) do
  self.include_root_in_json = true
end

Я сохранилпараметр инициализатора include_root_in_json имеет значение true, но он больше не будет сериализован с моделью в качестве корня JSON, когда у меня есть собственный класс сериализатора:

#app/serializers/car_serializer.rb

class CarSerializer < ActiveModel::Serializer
  attributes :id, :make, :model
end

Он сериализуется следующим образом:

{
  "id":29,
  "make":"Kia",
  "model":"Optima"
}

Я бы хотел, чтобы он сериализовался с именованным корнем, но мне нужен собственный сериализатор, чтобы удалить некоторые конфиденциальные поля из сериализации.

Как мне добиться того, что было в Rails 3 по умолчанию в Rails 4, так что яможно сохранить обратную совместимость API?

1 Ответ

0 голосов
/ 21 декабря 2018

Удалив пользовательский класс сериализатора, я смог получить корневой узел JSON в качестве имени модели.Чтобы добиться исключения чувствительных полей в модели из сериализации в JSON, я использовал условие except при рендеринге

# app/controllers/car_controller.rb

respond_to do |format|
  format.html # new.html.erb
  format.json { render json: @order, except: [:sensitive_field_1, :sensitive_field_2] }
end

. См. Документацию Rails 4.0 -> ActiveModel -> Serializer -> JSON.

...