Как использовать условные атрибуты с jsonapi-сериализаторами - PullRequest
0 голосов
/ 26 октября 2018

Я работаю над проектом Ruby on Rails с ruby-2.5.0 и Rails 5. Я работаю над api-частью, я использовал гем jsonapi-serializer в своем приложении.Я хочу добавить условный атрибут в сериализатор.

Контроллер:

class RolesController < ApplicationController
  def index
    roles = Role.where(application_id: @app_id)
    render json: JSONAPI::Serializer.serialize(roles, is_collection: true)
  end
end

Сериализатор:

class RoleSerializer
  include JSONAPI::Serializer

  TYPE = 'role'

  attribute :id
  attribute :name
  attribute :application_id

  attribute :application do
    JSONAPI::Serializer.serialize(object.application)
  end
end

Здесь приложение представляет собой модель, в которой роли и роли has_many принадлежат приложению.,Я хочу добавить детали приложения в некоторых условиях.Я также пробовал как:

Контроллер:

    class RolesController < ApplicationController
      def index
        roles = Role.where(application_id: @app_id)
        render json: JSONAPI::Serializer.serialize(roles, is_collection: true, params: params)
      end
    end

Сериализатор:

class RoleSerializer
  include JSONAPI::Serializer

  TYPE = 'role'

  attribute :id
  attribute :name
  attribute :application_id

  attribute :application do
    JSONAPI::Serializer.serialize(object.application), if: @instance_options[:application] == true
  end
end

Но @instance_options - ноль.Пожалуйста, помогите мне, как я могу это исправить.Заранее спасибо.

1 Ответ

0 голосов
/ 26 октября 2018

В jsonapi-serializer это то, что сказано о пользовательских атрибутах: «Блок оценивается в экземпляре сериализатора, поэтому у него есть доступ к переменным экземпляра объекта и контекста».

Итак, в вашем контроллере вы должны использовать:

render json: JSONAPI::Serializer.serialize(roles, is_collection: true, context: { application: true })

И в вашем сериализаторе вы должны использовать context[:application] вместо @instance_options

...