Я переключаюсь на Rails Active Storage, чтобы обрабатывать загрузку и хранение изображений локально (с помощью службы дисков) для каталога продуктов, и у меня возникают проблемы с получением доступного URL-адреса изображения для подачи в <img>
тег. Я использую React на внешнем интерфейсе, поэтому я не могу (легко) использовать помощники Rails для генерации тега.
ActiveStorage помещает файлы в /public/images
. Я могу жестко закодировать относительные ссылки на файлы (т. Е. http://localhost:3000/images/Ab/CD/AbCDEfGhIjkL
), и это прекрасно работает.
Соответствующий фрагмент из Product.rb
:
class Product < ApplicationRecord
attr_accessor :image_url
has_one_attached :image
def as_json(options)
h = super(options)
if self.image.attached?
h[:image_url] = ActiveStorage::Blob.service.service_url(self.image.key)
end
h
end
end
as_json
создает объект JSON для передачи в React с записью image_url
, которая используется для атрибута <img>
src
. С кодом выше, image_url
содержит полный путь к файлу (т.е. http://localhost:3000/srv/www/rails_app/public/images/Ab/CD/AbCDEfGhIjkL
). Использование url_for
в представлении дает тот же результат. Я хочу, чтобы он содержал только путь относительно корня rails.
Я мог бы манипулировать строкой, чтобы удалить все до относительного пути, но я предвижу, что это приведет к ошибкам в будущем, если что-нибудь изменится, поэтому я бы предпочел найти способ заставить ActiveStorage просто сгенерировать подходящую для меня строку.
Спасибо!