API REST Active Storage REST - PullRequest
       10

API REST Active Storage REST

0 голосов
/ 01 октября 2018

Мне удалось настроить Active Storage загрузку файлов, и теперь я пытаюсь вернуть связанные изображения, когда, например, Speaker.all или Speaker.find(2).

Вызов связанногоконечная точка Я получаю что-то вроде:

{
    "id": 2,
    "name": "Rafael",
    "email": "rafael.almeida@mail-provider.com",
    "company": "XING",
    "social_media": "{\"twitter\": \"@rafaelcpalmeida\"}",
    "created_at": "2018-10-01T17:21:50.993Z",
    "updated_at": "2018-10-01T17:21:51.144Z"
}

Как я могу также вернуть связанный аватар?

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Я понял, что делать, чтобы достичь желаемого результата.Во-первых, нам нужно добавить active_model_serializers к Gemfile, затем bundle install.

После того, как мы установили гем, мы должны добавить include ActionController::Serialization к каждому контроллеру, который будет использовать Serializer.

Мы генерируем новый сериализатор, используя rails g serializer speaker.Мой SpeakerSerializer выглядит так:

class SpeakerSerializer < ActiveModel::Serializer
  attributes :id, :name, :email, :company, :avatar

  def avatar
    rails_blob_path(object.avatar, only_path: true) if object.avatar.attached?
  end
end

А мой вывод выглядит как

{
    "speaker": {
        "id": 2,
        "name": "Rafael",
        "email": "rafael.almeida@xing.com",
        "company": "XING",
        "avatar": "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--515a0de8817b3529b5d3d168871cebf6ccee0463/xing-photo.jpg"
    }
}
0 голосов
/ 02 октября 2018

Проверьте, подходит ли этот подход для ваших нужд.Это случай has_one_attached.

Сначала извлеките запись:

speaker = Speaker.find(2)

Затем преобразуйте ее в хэш Ruby (обратите внимание .as_json):

speaker_hash = speaker.as_json

Теперь просто добавьте необходимое значение ключа пары, используя url_for helper:

speaker_hash['url'] = url_for(speaker.avatar)

Наконец, преобразуйте хеш в json:

speaker_hash.to_json
...