我正在使用主动模型序列化器和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框架之外执行此操作。 感谢
答案 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的方法