You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用KitSerializer序列化Kit.all?报model_name未定义错误求解

解决ActiveModel::Serializer序列化集合报错问题

错误原因

Kit.all返回的是ActiveRecord关系集合,你指定的KitSerializer是用于序列化单个Kit对象的序列化器,直接将集合传入并指定serializer: KitSerializer会导致Rails尝试用单个对象序列化器处理集合,从而触发undefined method 'model_name' for Kit::ActiveRecord_Relation:Class错误。

解决方法

方法一:使用each_serializer选项(推荐)

修改控制器方法,用each_serializer指定集合中每个对象使用的序列化器:

def kits_json
  @kits = Kit.all
  render json: @kits, each_serializer: KitSerializer
end

方法二:自定义集合序列化器(适合需扩展集合输出结构的场景)

创建专门处理集合的序列化器:

class KitCollectionSerializer < ActiveModel::Serializer
  def initialize(objects, options = {})
    @objects = objects
    @options = options
  end

  def serializable_hash
    {
      kits: @objects.map { |kit| KitSerializer.new(kit, @options).serializable_hash }
    }
  end
end

然后在控制器中使用这个集合序列化器:

def kits_json
  @kits = Kit.all
  render json: KitCollectionSerializer.new(@kits)
end

补充说明

若你使用的是较新版本的ActiveModel::Serializer,也可以在Kit模型中指定默认序列化器:

class Kit < ApplicationRecord
  self.serializer = KitSerializer
end

之后控制器只需直接渲染集合即可:

def kits_json
  @kits = Kit.all
  render json: @kits
end

内容的提问来源于stack exchange,提问作者Gibson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 16:55:48