我一直在四处寻找并找不到解决方案。
我有rails-api应用程序 和简单的模型,控制器和序列化器
但是当我尝试获取索引路由时,我得到的标准rails json没有被序列化。
class Tag < ActiveRecord::Base
end
class TagSerializer < ActiveModel::Serializer
attributes :id, :title
end
class TagsController < ApplicationController
def index
render json: Tag.all
end
end
我明白了:
[
tag: {
id: 1,
title: 'kifla'
},
tag:
.....
我想:
[
{ id: 1, title: 'kifla'},
{ .....
答案 0 :(得分:32)
这是因为在rails-api中默认没有加载序列化。你必须这样做:
class ApplicationController < ActionController::API
include ::ActionController::Serialization
end
答案 1 :(得分:20)
您似乎正在尝试禁用json输出的根元素。
如何实现这一目标可能取决于您使用的active_model_serializers
版本。
在0.9.x
中,你可以在Rails初始化程序中执行类似的操作:
# Disable for all serializers (except ArraySerializer)
ActiveModel::Serializer.root = false
# Disable for ArraySerializer
ActiveModel::ArraySerializer.root = false
或者简单地说,在你的控制器动作中:
class TagsController < ApplicationController
def index
render json: Tag.all, root: false
end
end
有关详细信息,请参阅最近版本的README页面相关部分的链接。
https://github.com/rails-api/active_model_serializers/tree/0-9-stable#disabling-the-root-element
https://github.com/rails-api/active_model_serializers/tree/0-8-stable#disabling-the-root-element
-
请注意,请确保您实际包含处理序列化的代码,因为默认情况下ActionController :: API不会。例如,
class ApplicationController < ActionController::API
include ActionController::Serialization
end
答案 2 :(得分:5)
如果您使用的是最新版本,似乎您无法再根据此设置默认适配器:
https://github.com/rails-api/active_model_serializers/issues/1683
解决方法是使用
render json: object_to_render, adapter: :json
此外,没有必要再添加它了:
include ::ActionController::Serialization
看到Rails api如何在没有详细文档的情况下将版本更改为版本,感到很沮丧。
答案 3 :(得分:4)
当使用最新的rails-api 4.2.0beta
时,我遇到了同样的问题序列化程序没有被提取。我将rails-api的评级降级到4.1.5并且有效。 别忘了删除
config.active_record.raise_in_transactional_callbacks = true
来自config / application.rb的它将在4.2.0之前的版本中引发错误