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但是我的研究让我陷入了死胡同.
任何建议都会非常受欢迎.谢谢!
问题是您没有在控制器中调用活动记录序列化器,因此不会拾取这些配置设置。
解决方案:创建一个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)
以及类似的结构SectorSerializer和SlotSerializer您想要的所有属性(这里是活动记录序列化器的入门文档和通用语法文档)
然后在你的控制器中:
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配置选项调用您。
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |