【问题标题】:active_model_serializers doesn't use serializer when render command contains more than just an activerecord model?当渲染命令包含的不仅仅是一个 activerecord 模型时,active_model_serializers 不使用序列化器?
【发布时间】:2014-12-30 21:50:33
【问题描述】:

我在 Rails 项目中设置了 active_model_serializers,并且可以成功地使用序列化器以这种方式显示 json:

render json: @user

但是,如果我将模型对象包含在更复杂的 json 响应中,gem 似乎无法自动使用序列化程序:

render json: { "success": true, "something": "xyz", user: @user }

我发现我可以执行以下操作来绕过它,尽管这样做很痛苦:

render json: { "success": true, "something": "xyz", user: UserSerializer.new(@user) }

此外,如上所示使用它似乎使其无法使用我在 ApplicationController 中指定为我的 default_serializer_options 的 root:false 选项。这意味着我必须尽可能地提出:

render json: { "success": true, "something": "xyz", user: UserSerializer.new(@user, root: false) }

有没有更好的方法来解决这个问题?似乎在每次渲染中都必须如此明确会削弱 AMS 的一些简单性/好处......

** 注意:这是 rails 4、ruby 2.0 和 active_model_serializers 0.8.0

【问题讨论】:

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


    【解决方案1】:

    active_model_serializers 允许一个序列化器从另一个序列化器继承。为了得到你正在寻找的结果,我会用"success""something" 作为属性创建一个ApplicationSerializer。然后其他序列化程序可以从中继承。基本上是这样的:

      class ApplicationSerializer < ActiveModel::Serializer
        self.root = false
        attributes :success, :something
    
        def success
          true
        end
    
        def something
          "xyz"
        end
      end
    
      class UserSerializer < ApplicationSerializer
        attributes :name, :email, :etc
      end
    

    请注意,在我的示例中,"success""something" 将在 json 中作为用户内的属性出现,而不是将用户作为单独的键。这样做完全有可能,但您似乎更愿意说render json: @user

    【讨论】:

    • 不过,当我要为六个不同的模型做这件事时,这也会变得很麻烦
    • 不幸的是,看起来有人处理了这个确切的问题,但他们的分支从未合并到 ams:github.com/rails-api/active_model_serializers/pull/300
    • 哈,这太糟糕了。那个可怜的公关在“接受”标签上坐了一年半,结果却被关闭了!我不太确定你对六个模型做同样的事情是什么意思。所有模型序列化器也可以从ApplicationSerializer 继承。它可以在它自己的文件中。
    • 呃,当尝试在更大的散列中序列化模型数组时,情况会变得更糟,因为你也不能使用“each_serializer:”。似乎我需要在渲染之前迭代​​模型,并对每个模型进行序列化,然后渲染序列化数组......
    猜你喜欢
    • 1970-01-01
    • 2012-05-11
    • 2016-07-16
    • 2015-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2015-08-03
    相关资源
    最近更新 更多