【问题标题】:How to customize json response with active-model-serializers?如何使用 active-model-serializers 自定义 json 响应?
【发布时间】:2017-05-19 07:28:46
【问题描述】:

我有一个 API,基于 Rails 4.2.6,使用 active-model-serializers 0.10.0。虽然 ams 很棒,但我想返回一个不代表表中列的键和值。该 API 用于创建一封信,我需要返回用户可以找到该信的 url。大致如下:

https://{DOMAIN}.com/letters/{LETTER.ID}

我是否以某种方式修改序列化程序来执行此操作,或者我是否呈现一些包含序列化程序信息的自定义 JSON?我检查了其他几个与自定义 JSON 输出有关的问题,但它们没有专门讨论这个问题。

编辑

我在下面尝试了您的方法,@max,尽管我不确定这是否完全符合您的意思。这是我添加到序列化程序中的内容:

attributes :id, :url, :date_created, etc...
def url
    "https://{www.example.com/previewpdf/mailings/#{id}"
end

我尝试了这两种方法,并使用了 self.id,但都返回了“未定义的方法 'id'”错误,所以我将继续使用。

编辑 #2 我切换到使用 :id 而不是 id,这使得未定义的方法错误消失了,但 url 在 JSON 中显示为

https://www.example.com/pdfpreview?SubOrderId=id

当我需要最后一部分来读取 SubOrderId=28291 或正在创建的邮件的任何 id 时。

编辑

这仍然让我感到困惑,有人知道如何在自定义字符串响应中包含 id 键的实际值吗?

【问题讨论】:

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


    【解决方案1】:

    如果存在与属性同名的方法,则序列化程序将调用该方法,而不是直接从被序列化的对象中获取属性。

    class FooSerializer < ActiveModel::Serializer
      attributes :bar, :url
      def url
        something_url(object)
      end
    end
    

    注意,被序列化的对象不需要有url 属性。

    另一种方法是使用带有块的attribute

    class FooSerializer < ActiveModel::Serializer
      attributes :bar, :url
      attribute(:url) { something_url(object) }
    end
    

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 2017-08-17
      相关资源
      最近更新 更多