#ruby-on-rails #json #ruby #api
#ruby-on-rails #json #ruby #API
Вопрос:
Я пытаюсь получить URL-адрес активного вложения хранилища в виде ответа JSON, но я не совсем правильно ответил вот мой код:
#projet.rb
class Projet < ApplicationRecord
has_many :appartements, dependent: :destroy
has_one_attached :image_de_couverture
has_one_attached :situation
has_many_attached :images
end
#projet_serializer.rb
class ProjetSerializer < ActiveModel::Serializer
include Rails.application.routes.url_helpers
attributes :id, :nom, :gouvernorat, :localite, :surface, :description, :en_cours, :fini,
:situation, :images, :image_de_couverture
def images
object.images.map do |image|
rails_blob_path(image, only_path: true) if object.images.attached?
end
end
def image_de_couverture
polymorphic_url(object.image_de_couverture, only_path: true) if
object.image_de_couverture.attached?
end
def situation
polymorphic_url(object.situation, only_path: true) if object.situation.attached?
end
end
#projets_controller.rb
class ProjetsController < ApplicationController
# show all projects
def index
@projets = Projet.all
render json: @projets
end
def set_projet
@projet = Projet.find(params[:id])
end
def projet_params
params.require(:projet).permit(:nom, :gouvernorat, :localite, :surface, :description, :situation, images: [])
end
end
и вот ответ, который я получаю с помощью этого кода
[
{
id: 1,
nom: "Test",
gouvernorat: "Test",
localite: "Test",
surface: 30303,
description: "Test",
en_cours: true,
fini: true,
situation: "/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--50589feef3ab662f5fb9877dbf4f0a21c79e2412/lame_rideau1.jpg",
images: [
"/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0550f31bd4e562c76dfd1aff9f0beac6483e1651/1.jpg",
"/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBFQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--11ec06652e38fc43b54ef93187905f4591115d3c/2.jpg",
],
image_de_couverture: null
},
]
вместо
"/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0550f31bd4e562c76dfd1aff9f0beac6483e1651/1.jpg"
я хочу ссылку на вложение.
Заранее спасибо.
Комментарии:
1. Если у вас нет
as_json
презентатора, вы просто получите дамп по умолчанию, который может быть уродливым .
Ответ №1:
Попробуйте изменить rails_blob_path
помощника rails_blob_url
на свой ProjetSerializer#images
. Вам также необходимо установить конфигурацию хоста в файле вашего приложения. Источник
# config/application.rb
class Application < Rails::Application
...
routes.default_url_options = { host: 'localhost:3000' }
end
Ответ №2:
def images
object.images.map do |image|
Rails.application.routes.url_helpers.rails_blob_url(image, only_path: true) if object.images.attached?
end
end
Комментарии:
1. это дает тот же результат, что и мой код,
"/rails/active_storage/blobs/redirect/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBEdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--0550f31bd4e562c76dfd1aff9f0beac6483e1651/1.jpg"
2. но на самом деле это сгенерированная ссылка из активного хранилища на изображение, если вы нажмете на нее или отправите запрос почтальоном. какую ссылку вы хотите на самом деле?
3. мне нужна ссылка, когда я нажимаю на нее, она открывает изображение, это не выполняет задание @dedypuji