Rails Active Model Serializer 包含在控制器中而不注入,与包含的参数有很多关系

tom*_*rez 5 ruby-on-rails active-model-serializers json-api ruby-on-rails-5

我看到关于 Rails 5、活动模型序列化器和 json-api 适配器的奇怪行为。

\n\n

给定以下带有Rolify gem 的用户模型:

\n\n
class User < ActiveRecord::Base\n  #\n  # Gem Includes\n  #\n  rolify\n\n\n  # Include devise modules.\n  devise :database_authenticatable,\n      :recoverable, :rememberable, :trackable, :validatable\n  include DeviseTokenAuth::Concerns::User\n\n  #\n  # Callbacks\n  #\n  after_create :assign_default_role\n\n  #\n  # Attributes\n  #\n  attr_accessor :remote_image\n\n  #\n  # Validations\n  #\n  validates :name, presence: true, length: {in: 1..100}\n  validates :last_name, presence: true, length: {in: 1..100}\n  validates :role_ids, presence: true, on: :update\n\n  #\n  # Relations\n  #\n  belongs_to :current_scenario, class_name: "Scenario"\n\n\n  #\n  # Private Instance Methods\n  #\n  def assign_default_role\n    self.add_role(:user) if self.roles.blank?\n  end\n\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及以下控制器代码:

\n\n
def show\n  @user = User.find(params[:id])\n  authorize @user\n  render json: @user, include: [\'roles\'], status: :ok\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,我将要呈现的角色关系作为 json api 响应的一部分,采用 json-api 适配器格式。

\n\n

仅供参考,UserSerializer

\n\n
class UserSerializer < ActiveModel::Serializer\n  #\n  # Attributes\n  #\n  attributes :id, :email, :name, :last_name, :image_url, :image_thumb_url, :created_at, :updated_at, :current_scenario_id, :last_sign_in_at\n\n  #\n  # Relations\n  #\n  has_one :current_scenario\n  has_many :roles\n\n  #\n  # Methods\n  #\n  def image_url\n    object.image_url\n  end\n\n  def image_thumb_url\n    object.image_url(:thumb)\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

当检索 json 响应时,我得到以下信息:

\n\n
{\n  "data": {\n    "id":"2",\n    "type":"users",\n    "attributes": {\n      "email":"talvarez@igaltex.com.ar", ...\n    },\n    "relationships": {\n      "current-scenario": {\n        "data": {\n          "id":"204",\n          "type":"scenarios"\n        }\n      },\n      "roles": {\n        "data": [\n          {\n            "id":1,\n            "name":"user",\n            "resource-type":null,\n            "resource-id":null,\n            "created-at":"2017-01-23T10:27:08.707-03:00",\n            "updated-at":"2017-01-23T10:27:08.707-03:00"\n          },\n          {\n            "id":2,\n            "name":"admin",\n            "resource-type":null,\n            "resource-id":null,\n            "created-at":"2017-01-24T09:40:53.020-03:00",\n            "updated-at":"2017-01-24T09:40:53.020-03:00"\n          }\n        ]\n      }\n    }\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

如您所见,包含的关系角色及其所有属性位于json-api 响应的关系片段内。角色数据不应该位于包含的片段内吗?顺便说一句,该片段丢失了?此外,在关系片段内部,角色应该仅作为参考出现,例如:{relationships: {roles: [{id: "1", type: "role"}, {id: "2", type: "role"}]}我错了吗?

\n\n

为了对比这一点,看看当也包含关系时会发生什么current_scenario

\n\n
{\n  "data": {\n    "id":"2",\n    "type":"users",\n    "attributes": {\n      "email":"talvarez@igaltex.com.ar",\n      "name":"Tom\xc3\xa1s",\n      "last-name":"Alvarez", \n      ...\n    },\n    "relationships": {\n      "current-scenario": {\n        "data": {\n          "id":"204",\n          "type":"scenarios"\n        }\n      },\n      "roles": {\n        "data": [\n          {\n            "id":1,\n            "name":"user",\n            "resource-type":null,\n            ...\n          }\n        ]\n      }\n    },\n    "included": [\n      {\n        "id":"204",\n        "type":"scenarios",\n        "attributes": {\n          "name":"Scenario reload II",\n          "description":null,\n          "created-at":"2017-04-18T11:55:35.242-03:00",\n          "updated-at":"2017-04-18T11:55:35.242-03:00"\n        },\n        "relationships": {\n          "scenario-stocks": {\n            "data":[]\n          }\n        }\n      }\n    ]\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

查看包含的片段现在如何显示,其中包含有关 current_scenario 的所有信息,并且仅将 current_scenario 的引用添加到关系片段中。这是因为角色是活动模型序列化器中的has_many关系,而current_scenariobelongs_to吗?我对 json-api 适配器规范的理解是否错误?

\n\n

非常感谢!

\n

tom*_*rez 1

哎哟。中的不一致之处JSON-API是因为我忘记在后端添加角色模型序列化器(Rails 5)。这是现在的 json 响应,这就是我正在寻找的:

\n\n
{\n"data": {\n    "id": "2",\n    "type": "users",\n    "attributes": {\n        "email": "talvarez@igaltex.com.ar",\n        "name": "Tom\xc3\xa1s",\n        "last-name": "Alvarez",\n        "image-url": "http://localhost:3001/uploads/user/image/2/05a4dc7.jpg",\n        "image-thumb-url": "http://localhost:3001/uploads/user/image/2/thumb_05a4dc7.jpg",\n        "created-at": "2017-01-23T10:39:12.485-03:00",\n        "updated-at": "2017-04-25T16:32:14.610-03:00",\n        "current-scenario-id": 204,\n        "last-sign-in-at": "2017-04-25T16:29:03.559-03:00"\n    },\n    "relationships": {\n        "current-scenario": {\n            "data": {\n                "id": "204",\n                "type": "scenarios"\n            }\n        },\n        "roles": {\n            "data": [{\n                "id": "1",\n                "type": "roles"\n            }, {\n                "id": "2",\n                "type": "roles"\n            }]\n        }\n    }\n},\n"included": [{\n    "id": "204",\n    "type": "scenarios",\n    "attributes": {\n        "name": "Scenario reload II",\n        "description": null,\n        "created-at": "2017-04-18T11:55:35.242-03:00",\n        "updated-at": "2017-04-18T11:55:35.242-03:00"\n    },\n    "relationships": {\n        "scenario-stocks": {\n            "data": []\n        }\n    }\n}, {\n    "id": "1",\n    "type": "roles",\n    "attributes": {\n        "name": "user"\n    }\n}, {\n    "id": "2",\n    "type": "roles",\n    "attributes": {\n        "name": "admin"\n    }\n}]\n
Run Code Online (Sandbox Code Playgroud)\n\n

}

\n