将 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
你找到了吗?
我正在尝试将我的应用程序变成 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
你找到了吗?