带有jsonapi的Ruby Active模型序列化器,如何表征链接

时间:2016-09-13 14:36:03

标签: ruby active-model-serializers json-api

我正在使用主动模型序列化器和jsonapi格式

我需要得到:

{
  "data": {
    "id": "1234",
    "type": "search",
    "relationships": {
      "foo": {
        "data": [
          {
            "id": "12",
            "type": "foo"
          }
        ],
       "links": "/foo/12"
      },        
    }
  },

我已经尝试了几种链接配置,但它没有显示如上

require 'active_model_serializers'
module test
 class SearchSerializer < ActiveModel::Serializer
   has_one :foo,  data: true, links: {self: true, related: true}
  type 'search'
 end
end

我想尊重jsonapi格式 是否有人有活跃模型序列化器和json_api的良好示例显示&#34;链接&#34;如上所述json?

目前只显示以下内容

 {"data": {
"id": "1234",
"type": "search",
"relationships": {
  "foo": {
    "data": [
      {
        "id": "12",
        "type": "foo"
      }
    ]
}

},

另请注意,我正在尝试在rails框架之外执行此操作。 感谢

3 个答案:

答案 0 :(得分:1)

很抱歉现在回答,但是如果仍然有人感兴趣...

真的很简单。首先,重要的是要注意JSON:API规范告诉我们相关链接应该是其URL扩展,最好显示通过Search(针对该情况)的路径,例如: http://localhost:3000/searches/:search_id/foo

所以我们的SearchSerializer应该类似于:

class SearchSerializer < ActiveModel::Serializer
  # The attributes
  attributes :id, :whatever, :something, :another_one

  has_one :foo do
    link(:related) { contact_foo_url(object.id) }
  end
end

还请注意,这时您应该包括类似于波纹管的路线和控制器show方法:

对于 routes.rb

Rails.application.routes.draw do
  resources :searches do
    resource :foo, only: [:show]
    # Also a best practice to dispose a 'relationships' path for this kinda example
    resource :foo, only: [:show], path: 'relationships/foo'
  end
end

对于FoosController.rb

class FoosController < ApplicationController
  before_action :set_search

  # GET /searches/1/foo
  def show
    render json: @search.foo
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_search
      @search = Search.find(params[:search_id])
    end
end

答案 1 :(得分:1)

脱离 FredyK 的答案,JSONAPI-SERIALIZER,是一个轻量级的无轨序列化器,用于您的 ruby​​ 对象(即使它确实集成了 Rails,如果需要),这可能是比使用 Active Record 更简单的解决方案。< /p>

此外,如果您不使用 Rails,JSONAPI-SERIALIZER 与新 gem EASY-JSONAPI 搭配得非常好,它是 JSON:API 请求和响应的中间件、解析器和响应验证器。

答案 2 :(得分:0)

在查看没有rails的JSONAPI的ruby中可用的内容之后,我结束了使用gem JSONAPI-serializers,设置更轻松,加载更轻(依赖性更低)。这与PORO更合适

我的序列化器变为

require_relative ./common_serializer module JsonSerializer class SearchSerializer < CommonSerializer attributes :foo, include_links: true def relationship_related_link(attribute_name) nil end end end 这个gem更容易使用,因为可以在序列化程序中(或在commonClass中)更改创建json的方法