Rails API版本控制,AMS不使用自定义序列化程序

时间:2016-09-17 17:07:39

标签: ruby-on-rails json rest api ruby-on-rails-5

我正在使用Rails应用程序并且我正在对API进行版本控制。

关注RailsCast #350我有这个:

routes.rb

namespace :v1 do         
  #resources for version 1
end

namespace :v2 do
  #resources for version 2
end

我使用active_model_serializer我有app/serializers/v1/.../v2/

(/ v1)

module V1
  class ResourceSerializer < ActiveModel::Serializer
      attributes :id
  end
end

(/ v2)

module V2
  class ResourceSerializer < ActiveModel::Serializer
      attributes :id, :data
  end
end

但是Rails并没有调用我的自定义序列化程序。

module V1

  class ResourcesController < ApplicationController

    def show
      @resource = Resource.find(params[:id])
      render json: @resource
    end
  end
end
.../v1/resources/1

OUTPUT

{"id":1,"name":"...","city":"...","created_at":"...","updated_at":"2..."}

而不是 {"id":1}

如果我提交 render json: @resources, serializer: ResourceSerializer ,则会检索 undefined method 'read_attribute_for_serialization'

任何帮助将不胜感激。谢谢!

编辑:命名空间有效!

2 个答案:

答案 0 :(得分:0)

我也遇到了这个问题,我尝试了很多解决方案,但是对我来说不起作用

唯一有效的解决方案是直接调用序列化程序类:

  render json: V1::ResourceSerializer.new(@resource)

如果您的问题只是“未定义的方法'read_attribute_for_serialization'”,请在您的ActiveModel子类中包含ActiveModel::Serialization

  module V1
    class ResourceSerializer < ActiveModel::Serializer
      include ActiveModel::Serialization

      attributes :id
    end
  end

答案 1 :(得分:0)

我终于使用each_serializer: V1::UserSerializercollectionsserializer: V2::UserSerializer获得了普通对象的解决方案。

感谢所有人。