Как выставить колонку наследования в JSON - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно предоставить в ответе JSON в поле JSON наследник_ наследства, чтобы я мог получить его в своем приложении (Angular).Как я могу это сделать?

Я много раз искал ответ на этот вопрос, но не нашел его!

В моем случае у меня есть Пользователь, который может быть Администратором, Сотрудником или Клиентом.Разница лишь в том, что у Клиента есть еще два поля, чем у Администратора и Сотрудника.Вот почему я решил реализовать STI.Не стесняйтесь сказать мне, если я сделал неправильный выбор по этому поводу.

Пример моего user_serializer.rb:

class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email, :type
end

enter image description here

Мой user.rb находится в / models

Мой users_controllers.rb находится в контроллерах / api / v1 /

ОБНОВЛЕНИЕ:

Мой контроллер:

class Api::V1::UsersController < Api::V1::BaseApiController
  before_action :authenticate_user!

  # some methods...

  def show
    user = User.find(params[:id])

    if user.present?
      render json: { data: user }, status: 200
    else
      head 404
    end
  end

  # some methods...

  private

  def user_params
    params.require(:user).permit(
      :id,
      :name,
      :email,
      :password, :password_confirmation,
      :registration,
      :cpf,
      :landline, :cellphone, :whatsapp,
      :simple_address,
      :public_agency_id,
      :public_office_id,
      :type
    )
  end
end

Моя модель:

class User < ApplicationRecord
  devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable

  include DeviseTokenAuth::Concerns::User

  # belongs_to :address
  attr_accessor :skip_password_validation

  validates :name, presence: true
  validates :type, presence: true

  scope :admins, -> { where(type: 'Admin') }
  scope :employees, -> { where(type: 'Employee') }
  scope :customers, -> { where(type: 'Customer') }

  # CALLBACKS
  before_validation :generate_uuid!
  before_create :downcase_email

  def password_required?
    return false if skip_password_validation
    super
  end

  def token_validation_response
    {
      id: id,
      email: email,
      name: name,
      surname: surname,
      cpf: cpf,
      landline: landline,
      cellphone: cellphone,
      whatsapp: whatsapp,
      simple_address: simple_address,
      created_at: created_at,
      updated_at: updated_at,
      type: type
    }
  end

  private

  def generate_uuid!
    self.uid = SecureRandom.uuid if self.uid.blank?
  end

  def downcase_email
    self.email = self.email.delete(' ').downcase
  end
end

Пример объекта ответа: Response sample

А насчет config / initializers / active_model_serializer.rb, такого файла нетв моем проекте.

1 Ответ

0 голосов
/ 23 мая 2018

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

В целом, похоже, вы не загружаете свой UserSerializer.Я бы предложил переместить его в корень сериализаторов и заставить его работать там: Затем, если вы хотите по какой-то причине переместить его в api / v1, вы можете сосредоточиться на проблеме с пространством имен, которая может зависать.

# app/serializers/user_serializer.rb
class UserSerializer < ActiveModel::Serializer
  attributes :id, :name, :email, :type
end

Если это работает, то вызов, такой как get /users/:id, должен возвращать что-то вроде:

{ "id": 1, "name":"Bill Gates", "email":"bigcheese@microsoft.com", "type": "Employee" } 

Возможно, вам также потребуется обновить контроллер приложения для сериализации:

class ApplicationController < ActionController::API
  include ActionController::Serialization

  # ...
end

Несколько ресурсов, которые могут быть полезны:

  1. Учебное пособие по кодированию
  2. Создание идеального API
...