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

Rails API versioning, AMS doesn't use custom serializers

我正在开发一个 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

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

而不是 {"id":1}

如果我输入 render json: @resources, serializer: ResourceSerializer 它会检索 undefined method 'read_attribute_for_serialization'

如有任何帮助,我们将不胜感激。谢谢!

编辑: 命名空间有效!

我也遇到了这个问题,我尝试了很多解决方案,但都不适合我

唯一可行的解​​决方案是直接调用序列化器class:

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

如果您的问题只有 "undefined method 'read_attribute_for_serialization'",请将 ActiveModel::Serialization 包含到您的 ActiveModel sub class

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

      attributes :id
    end
  end

我终于找到了一个解决方案,对 collections 使用 each_serializer: V1::UserSerializer,对普通对象使用 serializer: V2::UserSerializer

感谢大家。