active_model_serializers不在rails-api中工作

时间:2014-10-04 11:43:23

标签: ruby-on-rails-4 active-model-serializers rails-api

我一直在四处寻找并找不到解决方案。

我有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'},
  { .....

4 个答案:

答案 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之前的版本中引发错误