如何获取Active Storage映像的URL

zis*_*she 11 ruby ruby-on-rails ruby-on-rails-5 rails-activestorage

我希望通过api获取带有附加图像的记录列表作为链接或文件.

我有一个简单的模型:

class Category < ApplicationRecord
  has_one_attached :image
  validates :name, presence: true, uniqueness: true
end
Run Code Online (Sandbox Code Playgroud)

接下来的行动:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.to_json(include: { image_attachment: { include: :blob } })
  end
Run Code Online (Sandbox Code Playgroud)

这是我获得图像对象的唯一方法.

我看到下一个结果:

{"id":4,"name":"Cat1","description":""},
{"id":1,"name":"Cat2","description":"","image_attachment":
  {"id":8,"name":"image","record_type":"Category","record_id":1,"blob_id":8,"created_at":"2018-06-09T13:45:40.512Z","blob":
  {"id":8,"key":"3upLhH4vGxZEhhf3TaAjDiCW","filename":"Screen Shot 2018-06-09 at 20.43.24.png","content_type":"image/png","metadata":
  {"identified":true,"width":424,"height":361,"analyzed":true},"byte_size":337347,"checksum":"Y58zbYUVOlZRadx81wxOJA==","created_at":"2018-06-09T13:45:40.482Z"}}},
...
Run Code Online (Sandbox Code Playgroud)

我可以在这里看到文件名.但是文件存在于不同的文件夹中,对我而言,它似乎不是一种获取和链接到文件的便捷方式.

我找不到任何关于此的信息.

更新

根据iGian解决方案,我的代码变为:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.map { |category|
      category.as_json.merge({ image: url_for(category.image) })
    }
  end
Run Code Online (Sandbox Code Playgroud)

iGi*_*ian 22

对于我User,has_one_attached :avatar我可以在我的观点中获取网址<%= image_tag url_for(user.avatar) %>.所以,在控制器中我会使用url_for(user.avatar)

对于Category其中has_one_attached :image:

url_for(category.image)
Run Code Online (Sandbox Code Playgroud)

  • 我只是想补充一点,如果您不从视图访问它,您可以这样做:`Rails.application.routes.url_helpers.url_for(category.image)` (4认同)
  • 如果您需要完整路径,可以使用“polymorphic_url(category.image)”,其中包括“https://...”而不仅仅是路径。 (2认同)

小智 11

也试试@object.image.service_url。这将为您提供保存图像的网址。IE url 到亚马逊 s3 存储。

  • 这适用于下面的 Rails 6.1,但在 Rails 7 上停止工作。它现在从“service_url”重命名为“url”。 (6认同)