Rails 活动存储 REST API

Rails Active Storage REST API

我已经能够设置 Active Storage 文件上传,现在我正在尝试 return 关联图像,例如 Speaker.allSpeaker.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"
}

我怎样才能return它的关联头像?

检查此方法是否适合您的需求。 has_one_attached.

就是这种情况

首先,获取记录:

speaker = Speaker.find(2)

然后将其转换为Ruby散列(请注意.as_json):

speaker_hash = speaker.as_json

现在,只需使用 url_for 帮助程序附加您需要的键值对:

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

最后,将哈希值转换为json:

speaker_hash.to_json

我想出了怎么做才能达到我想要的结果。首先,我们需要将 active_model_serializers 添加到 Gemfile,然后是 bundle install

在我们安装 gem 之后,我们应该将 include ActionController::Serialization 添加到每个将要使用序列化程序的控制器。

我们使用 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"
    }
}