【问题标题】:ActiveModelSerializer not serialize object nested childrenActiveModelSerializer 不序列化对象嵌套子级
【发布时间】:2019-05-10 07:18:34
【问题描述】:

我有一个使用awesome_nested_set gem 的模型类别,所以它有模型本身的子级。我已经为模型创建了 CategorySerializer

class CategorySerializer < ActiveModel::Serializer
  attributes :id, :parent_id, :lft, :rgt, :text, :permalink, :children

  def children
    object.children
  end
end

但是 children 没有被序列化。我也试过加has_many :children, serializer: self,结果是这样的

{
        "id": 25918,
        "parent_id": null,
        "lft": 3,
        "rgt": 8,
        "text": "ARAG",
        "permalink": "25918-arag",
        "children": [
            {
                "id": 25919,
                "parent_id": 25918,
                "lft": 4,
                "rgt": 7,
                "text": "Coperchi",
                "permalink": "25919-coperchi",
                "children": [
                    {
                        "id": 25920,
                        "parent_id": 25919,
                        "lft": 5,
                        "rgt": 6,
                        "text": "Ribaltabili",
                        "description": "",
                        "page_title": "",
                        "meta_key": "",
                        "meta_description": "",
                        "key_1": null,
                        "key_2": null,
                        "key_3": null,
                        "extra": null,
                        "created_at": "2019-03-01T21:08:15.000+01:00",
                        "updated_at": "2019-04-02T12:27:05.000+02:00"
                    }
                ]
            }
        ]
    }

第二级子级已成功序列化,但子级未成功。有没有办法或替代序列化所有对象子项?

【问题讨论】:

    标签: ruby-on-rails ruby jsonserializer


    【解决方案1】:

    如果你想要默认深度嵌套,那么你可以在初始化文件中设置以下配置属性

    # config/initializers/active_model_serializer.rb    
    ActiveModelSerializers.config.default_includes = '**
    

    更多详情可以查看this

    您还可以为孩子添加另一个序列化程序,如下所示

    class CategorySerializer < ActiveModel::Serializer
      attributes :id, :parent_id, :lft, :rgt, :text, :permalink, :children
    
      def children
        ActiveModel::SerializableResource.new(object.children,  each_serializer: ChildrenSerializer)
      end
    end
    

    更多信息可以参考这个link

    【讨论】:

    • 第二个选项确实有效!我之前也试过这个,但是通过使用each_serializer: self 它会为#undefined method new'。
    【解决方案2】:

    这个对孩子调用序列化程序的解决方案怎么样?注意不要陷入深度嵌套的无限循环

    def children
      object.children.map { |obj| SomeSerializer.new(obj) }
    end
    

    【讨论】:

      猜你喜欢
      • 2013-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多