Ruby on rails 如何在版本化的活动模型序列化程序中生成RESTful根键?

Ruby on rails 如何在版本化的活动模型序列化程序中生成RESTful根键?,ruby-on-rails,json,ruby,active-model-serializers,serialization,Ruby On Rails,Json,Ruby,Active Model Serializers,Serialization,我有一个RubyonRails应用程序,通过scaffold生成了用户\控制器 # app/controllers/api/v1/users_controller.rb class Api::V1::UsersController < Api::V1::ApiController skip_before_action :verify_authenticity_token serialization_scope :view_context def show re

我有一个RubyonRails应用程序,通过scaffold生成了用户\控制器

 # app/controllers/api/v1/users_controller.rb
 class Api::V1::UsersController < Api::V1::ApiController
  skip_before_action :verify_authenticity_token
  serialization_scope :view_context

   def show
     render json: @user
   end
 end
你看到根键了吗?为什么它带有完整的名称空间?它应该是
{“user”:{…data}}

我不想为这个琐碎的问题申请、修补或破解。我想我遗漏了在文档中找不到的任何配置


请帮忙

因此,
ActiveModel::Serializer
似乎将包含模块的完整模型名用作根键,请参见

因此,要么在控制器中设置
root

class UsersController
或者,如果您不想在序列化程序中包含全名,您可以创建一个基本序列化程序

#app/serializers/api/base#u serializer.rb
类BaseSerializer
因此,似乎
ActiveModel::Serializer
使用包含模块的完整模型名作为根键,请参阅

因此,要么在控制器中设置
root

class UsersController
或者,如果您不想在序列化程序中包含全名,您可以创建一个基本序列化程序

#app/serializers/api/base#u serializer.rb
类BaseSerializer
发生这种情况的原因是您的模型是
Api::V1::User
,它很可能是由scaffold自动生成的

 # app/controllers/api/v1/users_controller.rb
 class Api::V1::UsersController < Api::V1::ApiController
  skip_before_action :verify_authenticity_token
  serialization_scope :view_context

   def show
     render json: @user
   end
 end
您确定需要在模型中进行版本控制吗

也许拥有一个型号
用户
并将名称空间版本控制仅应用于您的控制器和路由就足够了


如果您确实希望模型也具有
Vx
名称空间,那么您可以按照建议覆盖
json\u键
,无论是对所有序列化程序还是显式地对
Api::V1::UserSerializer

发生这种情况的原因是您的模型是
Api::V1::User
,它很可能是由scaffold自动生成的

 # app/controllers/api/v1/users_controller.rb
 class Api::V1::UsersController < Api::V1::ApiController
  skip_before_action :verify_authenticity_token
  serialization_scope :view_context

   def show
     render json: @user
   end
 end
您确定需要在模型中进行版本控制吗

也许拥有一个型号
用户
并将名称空间版本控制仅应用于您的控制器和路由就足够了



如果您确实希望将
Vx
名称空间也用于您的模型,那么您可以按照建议覆盖
json\u键
,可以覆盖所有序列化程序,也可以显式覆盖
Api::V1::UserSerializer

其中有什么作用?行
serialization\u scope:view\u context
可以删除否?

在那里做什么?可以删除行
serialization\u scope:view\u context
否?

是否使用
ActiveModel::Serializer
?是。错了吗?没关系,只是不同的序列化库,根据你使用的不同,答案是不同的。不是为了“那个家伙”,而是你试过gem而不是ASM吗?如果你在早期阶段,它可能是值得切换的,因为它要快得多;你不需要JsonApi规范,这很公平。如果您遵循该规范,那么gem是好的,否则就不能使用
ActiveModel::Serializer
?是的。错了吗?没关系,只是不同的序列化库,根据你使用的不同,答案是不同的。不是为了“那个家伙”,而是你试过gem而不是ASM吗?如果你在早期阶段,它可能是值得切换的,因为它要快得多;你不需要JsonApi规范,这很公平。如果你是按照这个规格的宝石是好的,否则不是大豆,我认为我们不需要版本的模型。我已经删除了…是的,我不认为我们需要版本的模型。我已经把它去掉了我有主意了。。但是它为Api::V1::UserSerializer:Class提供了
未定义的方法root'。我想我会选择第二个选项,实现一个基本序列化程序。。但是它为Api::V1::UserSerializer:Class提供了
未定义的方法root'。我想我应该使用第二个选项并实现一个基本序列化程序。它用于访问序列化程序中的当前用户和其他帮助程序方法。。。与这个问题无关。我忘了删除用于访问序列化程序中当前用户和其他帮助程序方法的内容。。。与这个问题无关。我忘了取下
   {
    "api/v1/user": {
        "id": 2,
        "phone": "999999999",
        "first_name": "Rajan",
        "email": "sample@h.com",
        "dob": "2000-01-01",
        "last_name": "Verma",
        "gender": "male",
        "otp_code": "503036"
      }
   }