Как настроить отклик json с помощью сериализаторов active-model?

У меня есть API, построенный на Rails 4.2.6 и использующий сериализаторы active-model-serializer 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, но оба возвращают ошибку "undefined method 'id'", так что я буду продолжать отключаться.

РЕДАКТИРОВАТЬ #2 Я переключился на использование:id вместо id, и это привело к исчезновению неопределенной ошибки метода, но URL-адрес отображается в JSON как

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

Когда мне нужно, чтобы эта последняя часть прочитала SubOrderId=28291, или что бы там ни было идентификатором создаваемого почтового сообщения.

РЕДАКТИРОВАТЬ

Это все еще вызывает недоумение, кто-нибудь знает, как включить фактическое значение ключа id в пользовательский строковый ответ?

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
Другие вопросы по тегам