获取任意(类型未知)模型实例的ActiveModel :: Serializer实例

时间:2014-05-24 20:42:33

标签: ruby-on-rails ruby serialization active-model-serializers

如果我有一个Project模型的实例,并且我想使用active_model_serializer将其序列化为任意哈希,我可以这样做:

render :json => {:foo => "bar", :model => ProjectSerializer.new(my_project).as_json}

但在我的场景中,我并不提前知道我的模型实例的类型,所以我需要多态地确定正确的序列化器。在active_model_serializer代码中查看,我在内部看到它使用ActiveModel::Serializer.serializer_for,但由于某种原因,它不能从控制器调用。我可以让它像这样工作:

begin
   serializer = Object.const_get "#{model.name}Serializer"
   object_hash = serializer.new(model).as_json
rescue NameError
   object_hash = model.as_json
end

这很好用,但我宁愿我的代码不关心序列化器的这个细节。有没有"权利"找到任意模型的序列化器的方法?

2 个答案:

答案 0 :(得分:3)

尝试:

model_instance.active_model_serializer

我不确定为什么没有记录,但它在代码中并且有效。

答案 1 :(得分:0)

对于Rails 5(ActiveModelSerializers 0.10)您可以使用ActiveModelSerializers::SerializableResource.new(model_instance),然后在其上调用#serializable_hash#to_json。自述文件中提供了更多详细信息:https://github.com/rails-api/active_model_serializers/blob/655c721d0d18988be795d767797cdcddc5369a87/README.md