如何在版本化的活动模型序列化程序中制作 RESTful 根密钥?
How to make RESTful root keys in versioned Active model serializer?
我在 rails 应用上有 ruby,user_controller 通过脚手架生成。
# 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
模特
# app/models/api/v1/user.rb
class Api::V1::User < Api::V1::ApiRecord
has_one_time_password
validates_presence_of :phone
end
和序列化器:
# app/serializers/api/v1/user_serializer.rb
class Api::V1::UserSerializer < ActiveModel::Serializer
attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code
def otp_code
object.otp_code
end
end
一切都很好,但我卡在了配置中。 /api/v1/users/2
给我下面的回复。
{
"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"
}
}
你看到根键了吗?为什么它带有完整的命名空间?它应该只是 { "user": { ...data } }
。
我不想为这个微不足道的应用程序打补丁或破解。我想我缺少在文档中找不到的任何配置。
请帮忙。
所以似乎 ActiveModel::Serializer
使用包括模块在内的完整模型名称作为根键,参见
因此,要么在控制器中设置 root
键。
class UsersController < ApplicationController
def index
render json: @users, root: "users"
end
end
或者,如果您不想在序列化程序中包含全名,您可以创建一个基本序列化程序
# app/serializers/api/base_serializer.rb
class BaseSerializer < ActiveModel::Serializer
def json_key
object.class.model_name.to_s.demodulize.underscore
end
end
# app/serializers/api/v1/user_serializer.rb
class Api::V1::UserSerializer < BaseSerializer
attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code
def otp_code
object.otp_code
end
end
发生这种情况的原因是您的模型 Api::V1::User
很可能是由脚手架自动生成的。
你确定你的模型需要版本控制吗?
也许拥有一个模型 User
并将命名空间版本控制仅应用于您的控制器和路由就足以满足您的应用需求。
如果你确实希望你的模型也有 Vx
命名空间,那么你可以按照 的建议覆盖 json_key
,对所有序列化程序或显式 Api::V1::UserSerializer
https://github.com/bsm/serialization_scopes 在那里做什么? serialization_scope :view_context
行可以删除吗?
我在 rails 应用上有 ruby,user_controller 通过脚手架生成。
# 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
模特
# app/models/api/v1/user.rb
class Api::V1::User < Api::V1::ApiRecord
has_one_time_password
validates_presence_of :phone
end
和序列化器:
# app/serializers/api/v1/user_serializer.rb
class Api::V1::UserSerializer < ActiveModel::Serializer
attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code
def otp_code
object.otp_code
end
end
一切都很好,但我卡在了配置中。 /api/v1/users/2
给我下面的回复。
{
"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"
}
}
你看到根键了吗?为什么它带有完整的命名空间?它应该只是 { "user": { ...data } }
。
我不想为这个微不足道的应用程序打补丁或破解。我想我缺少在文档中找不到的任何配置。
请帮忙。
所以似乎 ActiveModel::Serializer
使用包括模块在内的完整模型名称作为根键,参见
因此,要么在控制器中设置 root
键。
class UsersController < ApplicationController
def index
render json: @users, root: "users"
end
end
或者,如果您不想在序列化程序中包含全名,您可以创建一个基本序列化程序
# app/serializers/api/base_serializer.rb
class BaseSerializer < ActiveModel::Serializer
def json_key
object.class.model_name.to_s.demodulize.underscore
end
end
# app/serializers/api/v1/user_serializer.rb
class Api::V1::UserSerializer < BaseSerializer
attributes :id, :phone, :first_name, :email, :dob, :last_name, :gender, :otp_code
def otp_code
object.otp_code
end
end
发生这种情况的原因是您的模型 Api::V1::User
很可能是由脚手架自动生成的。
你确定你的模型需要版本控制吗?
也许拥有一个模型 User
并将命名空间版本控制仅应用于您的控制器和路由就足以满足您的应用需求。
如果你确实希望你的模型也有 Vx
命名空间,那么你可以按照 json_key
,对所有序列化程序或显式 Api::V1::UserSerializer
https://github.com/bsm/serialization_scopes 在那里做什么? serialization_scope :view_context
行可以删除吗?