【问题标题】:Get an ActiveModel::Serializer instance for an arbitrary (type unknown) model instance获取任意(类型未知)模型实例的 ActiveModel::Serializer 实例
【发布时间】:2014-07-14 00:10:33
【问题描述】:

如果我有一个 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

这很好用,但我宁愿我的代码不关心序列化程序的这个细节。是否有一种“正确”的方法可以找到任意模型的序列化程序?

【问题讨论】:

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


    【解决方案1】:

    试试:

    model_instance.active_model_serializer
    

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

    【讨论】:

    • 这正是我想要的。谢谢。
    【解决方案2】:

    对于 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

    【讨论】:

      猜你喜欢
      • 2013-07-09
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多