JSONAPI资源:序列化命名空间模型

时间:2015-10-26 21:56:57

标签: ruby-on-rails ruby json-api jsonapi-resources

我正在尝试在Rails引擎中使用JSONAPI Resources,我在doki_core / app / models / tenant.rb中定义了DokiCore::Tenant(模型),在doki_core中定义了DokiCore::TenantResource /app/resources/tenant_resource.rb。当我尝试序列化为哈希时,我遇到以下错误:

  

NoMethodError:未定义的方法tenant_path' for #<Module:0x007f9d04208778> from /Users/typeoneerror/.rvm/gems/ruby-2.2.2@doki/gems/jsonapi-resources-0.6.1/lib/jsonapi/link_builder.rb:77:in public_send'

资源使用model_name让它知道模型的实际位置:

module DokiCore
  class TenantResource < JSONAPI::Resource
    model_name 'DokiCore::Tenant'
    # ...
  end
end

我正在尝试输出这样的租户哈希:

tenant = DokiCore::Tenant.find(1); 
resource = DokiCore::TenantResource.new(tenant, nil); 
serializer = JSONAPI::ResourceSerializer.new(DokiCore::TenantResource); 
serializer.serialize_to_hash(resource);

这是错误发生的地方。

如何让链接正常工作和/或禁用它们?我假设这是在那里它将资源的URL添加为输出的json中“links”键下的链接。

2 个答案:

答案 0 :(得分:4)

对此进行排序。如果您的路由以任何方式命名空间,则您的资源也需要命名空间才能匹配。我的路线看起来像:

namespace :api do
  namespace :v1 do
    resources :tenants
  end
end

因此资源需要以相同的方式命名:

tenant = DokiCore::Tenant.find(1); 
resource = DokiCore::API::V1::TenantResource.new(tenant, nil); 
serializer = JSONAPI::ResourceSerializer.new(DokiCore::API::V1::TenantResource); 
serializer.serialize_to_hash(resource);

答案 1 :(得分:3)

序列化命名空间数据的另一种简单方法是使用jsonapi-utils gem。你只需要做这样的事情:

class API::V1::UsersController < API::V1::BaseController
  def index
    jsonapi_render json: User.all
  end
end

gem基于JSON API资源,带来了一种Rails方式,可以使用JSON API的规范来序列化数据。