如何用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
相关产品推荐
相关产品推荐

