如何使用active-model-serializers自定义json响应?

时间:2017-01-04 21:21:02

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

我有一个基于Rails 4.2.6构建的API,并使用活动模型序列化器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。编辑#2 我切换到使用:id而不是id,这使得未定义的方法错误消失,但是url在JSON中显示为

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

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

修改

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

1 个答案:

答案 0 :(得分:2)

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

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