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
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)
Veuillez suivre ceci pour récupérer des images (si vous utilisez has_many_attached )
Model.images.map{|img| ({ image: url_for(img) })}