【问题标题】:ActiveModelSerializers gem: how to pass parameter to serializerActiveModelSerializers gem:如何将参数传递给序列化器
【发布时间】:2016-10-28 18:48:20
【问题描述】:

我正在将 gem active_model_serializers 从版本 0.9.5 更新到 0.10.1。对于 0.9.5 版,以下代码有效。

控制器:

def create
  ...
  render json: @dia, app_rights: app_rights(@dia)
end

序列化器:

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer
  attributes :app_rights
  def app_rights
    serialization_options[:app_rights]
  end
end

方法serialization_options 已在版本 0.10.1 中弃用。

  • Here 建议改用instance_options
  • Here 建议使用options:“instance_options 仅在 master 分支中可用,在当前 RC 中不可用。在当前 RC 中,您必须使用 options 代替”。
  • 还有针对@options@instance_options 的建议。

我已尝试将serialization_options 替换为上述所有选项。但是,在所有情况下,更新 gem 后,生成的 json 都不包含app_rights。我做错了什么?

【问题讨论】:

  • 你使用的是什么 Rails 和 ruby​​ 版本?根据更改日志对 Rails 4.0 和 ruby​​ 2.0.0 的支持已被删除
  • 使用最新版本:ruby 2.3.1 和 rails 4.2.6
  • hmmm 有趣的是,他们说 0.10.x 不向后兼容 0.9 或 0.8,可能会提交“缺少迁移指南”的错误?
  • 答案是here
  • 简短回答:改用instance_options

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


【解决方案1】:

使用 instance_options,您的序列化程序应如下所示:

class Api::V1::SerializerWithSessionMetadata < ActiveModel::Serializer
    attributes :app_rights
    def app_rights
        @instance_options[:app_rights]
    end
end

为确保调用正确的序列化程序,您可以像这样渲染特定的序列化程序(否则它将渲染为@dia 上的类定义的任何内容):

render json: @dia, serializer: SerializerWithSessionMetadata, app_rights: app_rights(@dia)

【讨论】:

  • 谢谢,通过指定它工作的序列化程序(事实证明,我现在需要在整个应用程序的任何地方指定序列化程序,而不仅仅是上面的示例)。这真的很奇怪,如果可能的话,我想知道为什么会这样。这就是我发现的:使用新的 gem 版本,如果我没有在控制器中指定序列化程序,它仍然会自动使用 RIGHT 序列化程序,但它不会序列化在序列化程序中的方法内部计算的属性。换句话说,它只序列化它可以直接从数据库中读取的属性。对此有何想法?
  • 如果 AMS 没有找到正确的序列化器,它只是将对象转换为 json,它只会读取 DB 属性。仅当您将序列化程序类命名为 MyObjectSerializer(如果 @dia 是 MyObject)时,AMS 才会自动链接正确的序列化程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-14
  • 2019-07-25
  • 1970-01-01
  • 2021-06-20
  • 1970-01-01
相关资源
最近更新 更多