如何将条件属性与 jsonapi-serializers 一起使用

How to use conditional attributes with jsonapi-serializers

我正在使用 ruby-2.5.0 和 Rails 进行 Rails 项目的 Ruby 5. 我正在处理 api 部分,我在我的应用程序中使用了 jsonapi-serializers gem。我想在序列化器中添加条件属性。

控制器:

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

这里的application是has_many角色和角色属于application的模型。我想在某些情况下添加应用程序详细信息。我也试过:

控制器:

    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 是零。请帮助我如何解决它。提前致谢。

jsonapi-serializers 中,这是关于自定义属性的内容: 'The block is evaluated within the serializer instance, so it has access to the object and context instance variables.'

因此,在您的控制器中您应该使用:

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

并且在你的序列化器中你应该使用 context[:application] 而不是 @instance_options