我正在尝试让我的应用程序以小写的camelcase返回以进行最终的
JSON API格式化.
我已经安装了gem’active_model_serializers’并创建了一个新的初始化程序,其中包含以下代码:
ActiveModelSerializers.config.adapter = :json_api ActiveModelSerializers.config.key_transform = :camel_lower
然后我有一个返回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
有关API控制器继承模式的更多信息:类API :: V1 :: BaseController<的ActionController :: Base的 问题 在我的API响应中,事情仍然是蛇形的,我在控制台中看到了这个错误[active_model_serializers]渲染了ActiveModel :: Serializer :: Null,但是我的研究让我陷入了死胡同的困境. 任何建议都会非常受欢迎.谢谢!
解决方法
问题是你没有在控制器中调用活动记录序列化程序,因此这些配置设置没有被选中.
解:
在“app / serializers / user_serializer.rb”中创建一个看起来像这样的UserSerializer:
class UserSerializer < ActiveModel::Serializer attributes :id has_many :sectors has_many :slots end
以及类似结构的SectorSerializer和SlotSerializer,它们具有您想要的所有属性(以下是活动记录序列化程序的getting started docs和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的扇区然后使用camel_case配置选项调用你的UserSerializer.