Как сделать ключи RESTful root в сериализаторе модели Active с версией? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть приложение ruby on rails с user_controller, сгенерированным через scaffold.

 # app/controllers/api/v1/users_controller.rb
 class Api::V1::UsersController < Api::V1::ApiController
  skip_before_action :verify_authenticity_token
  serialization_scope :view_context

   def show
     render json: @user
   end
 end

Модель

  # app/models/api/v1/user.rb
  class Api::V1::User < Api::V1::ApiRecord
    has_one_time_password

    validates_presence_of :phone
  end

И сериализатор:

 # app/serializers/api/v1/user_serializer.rb
  class Api::V1::UserSerializer < ActiveModel::Serializer
    attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code

    def otp_code
        object.otp_code
    end
  end

Все в порядке, но я застрял в конфигурации. /api/v1/users/2 дает мне ответ ниже.

   {
    "api/v1/user": {
        "id": 2,
        "phone": "999999999",
        "first_name": "Rajan",
        "email": "sample@h.com",
        "dob": "2000-01-01",
        "last_name": "Verma",
        "gender": "male",
        "otp_code": "503036"
      }
   }

Вы видели ключ root? почему он идет с полным пространством имен? это должно быть только { "user": { ...data } }.

Я не хочу применять исправления или хаки для этого тривиального. Я думаю, что мне не хватает какой-либо конфигурации, которую я не могу найти в документации.

Помогите, пожалуйста.

Ответы [ 3 ]

1 голос
/ 18 июня 2020

Причина этого в том, что ваша модель Api::V1::User, скорее всего, была автоматически сгенерирована каркасом.

Вы уверены, что вам понадобится управление версиями в вашей модели?

Возможно наличие модели User и применение управления версиями пространств имен только к вашим контроллерам и маршрутам будет достаточно для вашего приложения.

Если вы действительно хотите иметь пространство имен Vx для ваших моделей, тогда вы может переопределить json_key как предлагает Christian Bruckmayer , либо для всех сериализаторов, либо явно для Api::V1::UserSerializer

1 голос
/ 18 июня 2020

Похоже, что ActiveModel::Serializer использует полное название модели, включая модули, в качестве клавиши root, см.

https://github.com/rails-api/active_model_serializers/blob/0-10-stable/lib/active_model/serializer.rb#L384 -L391

Так что либо вы установите ключ root в вашем контроллере.

class UsersController < ApplicationController
  def index
    render json: @users, root: "users"
  end
end

Или, если вы никогда не хотите включать полное имя в свой сериализатор, вы можете создать базовый сериализатор

# app/serializers/api/base_serializer.rb
class BaseSerializer < ActiveModel::Serializer
  def json_key
    object.class.model_name.to_s.demodulize.underscore
  end
end

# app/serializers/api/v1/user_serializer.rb
class Api::V1::UserSerializer < BaseSerializer
  attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code

  def otp_code
    object.otp_code
  end
end
0 голосов
/ 18 июня 2020

Что там делает https://github.com/bsm/serialization_scopes? Строку serialization_scope :view_context нельзя удалить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...