tom*_*rez 5 ruby-on-rails active-model-serializers json-api ruby-on-rails-5
我看到关于 Rails 5、活动模型序列化器和 json-api 适配器的奇怪行为。
\n\n给定以下带有Rolify gem 的用户模型:
\n\nclass 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\nRun Code Online (Sandbox Code Playgroud)\n\n以及以下控制器代码:
\n\ndef show\n @user = User.find(params[:id])\n authorize @user\n render json: @user, include: [\'roles\'], status: :ok\nend\nRun Code Online (Sandbox Code Playgroud)\n\n如您所见,我将要呈现的角色关系作为 json api 响应的一部分,采用 json-api 适配器格式。
\n\n仅供参考,UserSerializer:
\n\nclass 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\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n如您所见,包含的关系角色及其所有属性位于json-api 响应的关系片段内。角色数据不应该位于包含的片段内吗?顺便说一句,该片段丢失了?此外,在关系片段内部,角色应该仅作为参考出现,例如:{relationships: {roles: [{id: "1", type: "role"}, {id: "2", type: "role"}]}我错了吗?
为了对比这一点,看看当也包含关系时会发生什么current_scenario:
{\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}\nRun Code Online (Sandbox Code Playgroud)\n\n查看包含的片段现在如何显示,其中包含有关 current_scenario 的所有信息,并且仅将 current_scenario 的引用添加到关系片段中。这是因为角色是活动模型序列化器中的has_many关系,而current_scenario是belongs_to吗?我对 json-api 适配器规范的理解是否错误?
\n\n非常感谢!
\n哎哟。中的不一致之处JSON-API是因为我忘记在后端添加角色模型序列化器(Rails 5)。这是现在的 json 响应,这就是我正在寻找的:
{\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}]\nRun Code Online (Sandbox Code Playgroud)\n\n}
\n| 归档时间: |
|
| 查看次数: |
2274 次 |
| 最近记录: |