如何使用camelcased键名从Rails返回JSON

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中呈现.


dim*_*nyc 6

另一种选择是使用Olive_branch gem。正如描述的这个帖子,所有你需要做的是:

  1. 添加此宝石
  2. config.middleware.use OliveBranch::Middlewareapplication.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)