获取Rails 5应用程序以返回JSON API格式

Zac*_*iro 6 ruby-on-rails active-model-serializers json-api

我正在尝试让我的应用程序以小写的camelcase返回以进行最终的JSON API格式化.

我安装gem 'active_model_serializers'并创建了一个新的初始化程序,其中包含以下代码:

ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower
Run Code Online (Sandbox Code Playgroud)

然后我有一个返回json的小API,就像所有最好的互联网应用程序一样:

class Api::V1::UsersController < API::V1::BaseController
  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
Run Code Online (Sandbox Code Playgroud)

有关API控制器继承模式的更多信息: class API::V1::BaseController < ActionController::Base

问题

在我的API响应中,事情仍然是蛇形的,我在控制台中看到了这个错误,[active_model_serializers] Rendered ActiveModel::Serializer::Null但是我的研究让我陷入了死胡同.

任何建议都会非常受欢迎.谢谢!

Geo*_*rge 3

问题是您没有在控制器中调用活动记录序列化器,因此不会拾取这些配置设置。

解决方案:创建一个UserSerializer看起来"app/serializers/user_serializer.rb"像这样的:

class UserSerializer < ActiveModel::Serializer
  attributes :id

  has_many :sectors
  has_many :slots
end
Run Code Online (Sandbox Code Playgroud)

以及类似的结构SectorSerializerSlotSerializer您想要的所有属性(这里是活动记录序列化器的入门文档通用语法文档)

然后在你的控制器中:

class Api::V1::UsersController < API::V1::BaseController
  def sky
    @user = User.includes(:sectors, :slots).find_by_id(params[:user_id])

    if @user
      render json: @user
    else
      raise "Unable to get Sky"
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

它将急切加载 :slots 和 :sectors 并包含然后UserSerializer使用您的camel_case配置选项调用您。