我正在使用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为零。请帮我如何解决它。预先感谢。
答案 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]