如何在jsonapi-serializers中使用条件属性

时间:2018-10-26 18:32:11

标签: ruby-on-rails rails-api jsonapi-serialize

我正在使用ruby-2.5.0和Rails 5进行Ruby on Rails项目。我正在处理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

这里的应用程序是一个具有许多角色并且角色属于应用程序的模型。我想在某些情况下添加应用程序详细信息。我也尝试过:

控制器:

    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 :(得分:2)

jsonapi-serializers中,这是关于自定义属性的内容: “该块是在序列化程序实例中评估的,因此它可以访问对象和上下文实例变量。”

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

UPDATE 
    table1
    INNER JOIN table5 ON id_t5 = id_t3
    INNER JOIN table3 ON id_t1 = id_t3
    LEFT JOIN table2 ON table5.id_t2_fk = table2.id_t2 
    LEFT JOIN table4 ON table4.id_t3_fk = table1.id_t1
SET
    table2.icon        = "new icon",
    table3.title       = "new title",
    table4.description = "new description"
WHERE
    table1.id_t1= 816;

在序列化程序中,您应该使用render json: JSONAPI::Serializer.serialize(roles, is_collection: true, context: { application: true }) 而不是context[:application]