как получить URL-адрес активного вложения хранилища в виде json в ruby

#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