web-dev-qa-db-fra.com

Comment obtenir l'URL de l'image Active Storage

Je veux obtenir la liste des enregistrements avec des images jointes sous forme de liens ou de fichiers par api.

J'ai un modèle simple:

class Category < ApplicationRecord
  has_one_attached :image
  validates :name, presence: true, uniqueness: true
end

Et action suivante:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.to_json(include: { image_attachment: { include: :blob } })
  end

C'est la seule façon dont je peux obtenir un objet image. 

Et je vois les résultats suivants:

{"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"}}},
...

Je peux voir le nom de fichier ici. Mais les fichiers résident dans des dossiers différents et il ne me semble pas que ce soit un moyen pratique d'obtenir un lien vers le fichier.

Je n'ai trouvé aucune information à ce sujet.

Mis à jour

Selon la solution iGian, mon code devient:

  def index
    @categories = Category.all.with_attached_image

    render json: @categories.map { |category|
      category.as_json.merge({ image: url_for(category.image) })
    }
  end
5
zishe

Pour ma User quel has_one_attached :avatar je peux obtenir l'URL dans mes vues avec <%= image_tag url_for(user.avatar) %>. Donc, dans le contrôleur, j'utiliserais simplement url_for(user.avatar)

Pour Category quel has_one_attached :image:

url_for(category.image)
7
iGian

Veuillez suivre ceci pour récupérer des images (si vous utilisez has_many_attached )

Model.images.map{|img| ({ image: url_for(img) })}
0
Ankit Varshney