将 Rails 5 个应用程序设置为 return JSON API 格式

Getting Rails 5 app to return JSON API format

我正在尝试将我的应用程序变成 return 小写驼峰式,以便最终 JSON API 格式化。

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

ActiveModelSerializers.config.adapter = :json_api
ActiveModelSerializers.config.key_transform = :camel_lower

然后我有一个小的 API returns json,因为所有最好的互联网应用程序都这样做:

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

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

问题

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

非常欢迎任何建议。谢谢!

从这个拉取请求 (*) 看来,您应该能够在 ActiveModel::Serializers 配置中配置 key_format = :lower_camel

(*) https://github.com/rails-api/active_model_serializers/pull/534

问题是您没有在您的控制器中调用活动记录序列化程序,所以这些配置设置没有被拾取。

解决方法: 在 "app/serializers/user_serializer.rb" 中创建一个 UserSerializer 应该看起来像这样:

class UserSerializer < ActiveModel::Serializer
  attributes :id

  has_many :sectors
  has_many :slots
end

以及类似结构的 SectorSerializer 和一个 SlotSerializer,每个属性都包含您想要的所有属性(这里是活动记录序列化程序的 getting started docs and the general syntax docs

然后在你的控制器中:

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

这将使用 includes 急切加载 :slots 和 :sectors,然后使用您的 camel_case 配置选项调用您的 UserSerializer

在你的控制器中输入 respond_to :json

class Api::V1::UsersController < API::V1::BaseController

  respond_to :json

并在操作中放入与您相同的内容

def sky
   ...      
   render json: obj
   ...       
end

并在基础控制器中定义

protect_from_forgery with: :null_session, if: Proc.new { |c| c.request.format == 'application/json' }

我觉得对你有帮助。在我的例子中,我使用 gem 'active_model_serializers', '~> 0.10.5' 这取决于 case_transform (>= 0.2)

rails console 我可以做到

CaseTransform.camel_lower(initially_serialized_output)                                                       
=> {:name=>"My Company", :jsonThings=>{:rating=>8, :aKey=>{:aSubkey=>{:anotherKey=>"value"}}}}

我的研究是循序渐进的: https://github.com/rails-api/active_model_serializers/pull/1993 => https://github.com/NullVoxPopuli/case_transform-rust-extensions

你找到了吗?