Zac*_*iro 5 ruby camelcasing ruby-on-rails rails-api
我正在构建一个带有Rails后端的JS应用程序,为了不混淆蛇和骆驼的情况,我想通过从服务器返回camelcase密钥名称来规范化它.因此从API user.last_name返回user.lastName时会返回.
我该如何实现这一目标?谢谢!
编辑:添加控制器代码
class Api::V1::UsersController < API::V1::BaseController
# authorize_resource
respond_to :json, only: [:index]
def sky
@user = User.find_by_id(params[:user_id])
if @user
obj = {
sky: {
sectors: @user.sectors,
slots: @user.slots
}
}
render json: obj
else
raise "Unable to get Sky"
end
end
end
Run Code Online (Sandbox Code Playgroud)
mov*_*son 11
我这样做的方法是使用ActiveModelSerializer和json_api适配器:
在您的Gemfile中,添加:
gem 'active_model_serializers'
Run Code Online (Sandbox Code Playgroud)
创建一个新文件/config/initializers/ams.rb包含:
ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower
Run Code Online (Sandbox Code Playgroud)
您的控制器操作应如下所示:
class ApiController < ApplicationController
def sky
@user = User.find_by_id(params[:user_id])
if @user
render json: @user, serializer: UserSkySerializer
else
raise "Unable to get Sky"
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在您需要创建一个序列化程序.首先,创建一个新目录app/serializers/.
接下来,创建一个新的序列化程序app/serializers/user_sky_serializer.rb,包含:
class UserSkySerializer < ActiveModel::Serializer
attributes :sectors, :slots
end
Run Code Online (Sandbox Code Playgroud)
结果类似于您在obj哈希中描述的内容,但所有属性键都将使用jsonapi标准在camelCase中呈现.
另一种选择是使用Olive_branch gem。正如描述的这个帖子,所有你需要做的是:
config.middleware.use OliveBranch::Middleware在application.rb。然后,将此标头添加到来自客户端应用程序的请求中:
'X-Key-Inflection': 'camel'
Run Code Online (Sandbox Code Playgroud)
如果您使用像axios这样的库,您可以将此标头与其他标头一起添加到常量中:
const HEADERS = {
...
'X-Key-Inflection': 'camel'
}
const request = axios.post(url, param, HEADERS)
Run Code Online (Sandbox Code Playgroud)
这样您就不需要deep_transform在服务器端手动键入密钥。即使是深度嵌套的 json 键也会被骆驼化。来自此类请求的示例响应:
[
{
"id": 1,
"firstName": "Foo",
"lastName": "Bar",
"createdAt": ...,
"updatedAt": ...,
...
"cabinAssignments": [
{
"id": 1,
"cabinKeeperId": 1,
"userId": 1,
"houseId": 1,
...
}
]
}
]
Run Code Online (Sandbox Code Playgroud)