【发布时间】:2017-09-25 12:11:05
【问题描述】:
我看到有关 rails 5、活动模型序列化程序和 json-api 适配器的奇怪行为。
给定以下带有 Rolify gem 的 User 模型:
class User < ActiveRecord::Base
#
# Gem Includes
#
rolify
# Include devise modules.
devise :database_authenticatable,
:recoverable, :rememberable, :trackable, :validatable
include DeviseTokenAuth::Concerns::User
#
# Callbacks
#
after_create :assign_default_role
#
# Attributes
#
attr_accessor :remote_image
#
# Validations
#
validates :name, presence: true, length: {in: 1..100}
validates :last_name, presence: true, length: {in: 1..100}
validates :role_ids, presence: true, on: :update
#
# Relations
#
belongs_to :current_scenario, class_name: "Scenario"
#
# Private Instance Methods
#
def assign_default_role
self.add_role(:user) if self.roles.blank?
end
end
以及以下控制器代码:
def show
@user = User.find(params[:id])
authorize @user
render json: @user, include: ['roles'], status: :ok
end
如您所见,我将要呈现的角色关系作为 json api 响应的一部分,使用 json-api 适配器格式。
仅供参考,UserSerializer:
class UserSerializer < ActiveModel::Serializer
#
# Attributes
#
attributes :id, :email, :name, :last_name, :image_url, :image_thumb_url, :created_at, :updated_at, :current_scenario_id, :last_sign_in_at
#
# Relations
#
has_one :current_scenario
has_many :roles
#
# Methods
#
def image_url
object.image_url
end
def image_thumb_url
object.image_url(:thumb)
end
end
在检索 json 响应时,我得到以下信息:
{
"data": {
"id":"2",
"type":"users",
"attributes": {
"email":"talvarez@igaltex.com.ar", ...
},
"relationships": {
"current-scenario": {
"data": {
"id":"204",
"type":"scenarios"
}
},
"roles": {
"data": [
{
"id":1,
"name":"user",
"resource-type":null,
"resource-id":null,
"created-at":"2017-01-23T10:27:08.707-03:00",
"updated-at":"2017-01-23T10:27:08.707-03:00"
},
{
"id":2,
"name":"admin",
"resource-type":null,
"resource-id":null,
"created-at":"2017-01-24T09:40:53.020-03:00",
"updated-at":"2017-01-24T09:40:53.020-03:00"
}
]
}
}
}
}
如您所见,包含的关系角色及其所有属性位于 json-api 响应的 relationships 片段中。角色数据不应该在 included 片段中吗?顺便说一句,这是缺失的?此外,在关系片段 roles 内部应该仅作为参考出现,例如:{relationships: {roles: [{id: "1", type: "role"}, {id: "2", type: "role"}]} 我错了吗?
为了对比这一点,看看同时包含current_scenario 关系时会发生什么:
{
"data": {
"id":"2",
"type":"users",
"attributes": {
"email":"talvarez@igaltex.com.ar",
"name":"Tomás",
"last-name":"Alvarez",
...
},
"relationships": {
"current-scenario": {
"data": {
"id":"204",
"type":"scenarios"
}
},
"roles": {
"data": [
{
"id":1,
"name":"user",
"resource-type":null,
...
}
]
}
},
"included": [
{
"id":"204",
"type":"scenarios",
"attributes": {
"name":"Scenario reload II",
"description":null,
"created-at":"2017-04-18T11:55:35.242-03:00",
"updated-at":"2017-04-18T11:55:35.242-03:00"
},
"relationships": {
"scenario-stocks": {
"data":[]
}
}
}
]
}
}
查看包含的片段现在如何显示有关 current_scenario 的所有信息,并且只有对 current_scenario 的引用被添加到 relationships 片段中。这是因为角色是活动模型序列化程序中的 has_many 关系,而 current_scenario 是 belongs_to 吗?我对 json-api 适配器规范的理解有误吗?
非常感谢!
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-5 active-model-serializers json-api