Rails Active Storage: получите относительный путь службы диска для вложения - PullRequest
0 голосов
/ 28 апреля 2019

Я переключаюсь на 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 просто сгенерировать подходящую для меня строку.

Спасибо!

1 Ответ

1 голос
/ 28 апреля 2019

Вам нужно использовать помощник маршрутов для создания URL-адреса вашего приложения Rails.

https://guides.rubyonrails.org/active_storage_overview.html#linking-to-files

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] = Rails.application.routes.url_helpers.rails_blob_path(self.image)
        end
        h
    end
end
...