【问题标题】:Rails Active Storage REST APIRails 活动存储 REST API
【发布时间】:2018-10-01 19:09:17
【问题描述】:

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

我怎样才能返回其关联的头像?

【问题讨论】:

  • 试试Speaker.find(2).avatar(我猜你的型号)
  • @iGian 已经做到了,这并没有返回我在上面发布的 JSON 的其余部分的头像:(
  • 我不认为您可以将SpeakerActiveStorage::AttachmentActiveStorage::Blob 一起加入,但您始终可以手动将元素添加到您的数据结构中。您需要从关联的头像(文件名、元数据、字节大小......)中得到什么?预期的输出是什么?
  • 我想将他自己的头像的路径附加到Speaker JSON 结构中。例如,我已经设法使用视图并遍历 Speakers 数组来做到这一点,但是,我似乎无法通过 json 返回来做到这一点。

标签: ruby-on-rails rails-activestorage


【解决方案1】:

我想出了如何做才能达到我想要的结果。首先,我们需要将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"
    }
}

【讨论】:

  • 除非您先导入 url 帮助程序,否则这将不起作用。然后效果很好。在 SpeakerSerializer 类声明下方添加:include Rails.application.routes.url_helpers
【解决方案2】:

检查这种方法是否适合您的需求。 has_one_attached就是这种情况。

首先,获取记录:

speaker = Speaker.find(2)

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

speaker_hash = speaker.as_json

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

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

最后将hash转换成json:

speaker_hash.to_json

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 2018-10-22
    相关资源
    最近更新 更多