Как настроить отклик 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