ActiveStorage service_url && rails_blob_path не может генерировать полный URL, если не используется S3 - PullRequest
0 голосов
/ 30 июня 2018

У меня есть базовая настройка ActiveStorage с одной моделью, has_many_attached :file_attachments. В другом сервисе я пытаюсь создать ссылку для использования вне основного приложения (электронная почта, работа и т. Д.).

С S3 в производстве я могу сделать: item.file_attachments.first.service_url и я получаю соответствующую ссылку на корзину S3 + объект.

Я не могу использовать метод, предписанный в направляющих рельсов: Rails.application.routes.url_helpers.rails_blob_path(item.file_attachments.first)

Это ошибки с: ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true Я могу передать ему аргумент host: 'http://....', и он счастлив, хотя он и не генерирует полный URL, только путь.

В разработке Я использую дисковое хранилище файлов и не могу использовать ни один из методов:

> Rails.application.routes.url_helpers.rails_blob_path(item.file_attachments.first)
ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

Настройка хоста здесь также не генерирует полный URL.

В производстве service_url работает, однако здесь, в разработке, я получаю ошибку:

> item.file_attachments.first.service_url
ArgumentError: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true

и указание хоста не помогает:

item.file_attachments.first.service_url(host:'http://localhost.com')
ArgumentError: unknown keyword: host

Я также пытался добавить

config.action_mailer.default_url_options = { :host => "localhost:3000" }
config.action_storage.default_url_options = { :host => "localhost:3000" }
Rails.application.routes.default_url_options[:host] = 'localhost:3000'

безуспешно.

У меня вопрос - как мне получить полный URL-адрес таким образом, чтобы он работал как в разработке, так и в производстве? или где мне установить хост?

1 Ответ

0 голосов
/ 30 июня 2018

Служба дисков Active Storage ожидает найти хост для генерации URL в ActiveStorage::Current.host.

При вызове ActiveStorage::Blob#service_url вручную убедитесь, что установлено ActiveStorage::Current.host. Если вы вызываете его из контроллера, вы можете создать подкласс ActiveStorage::BaseController. Если это не вариант, установите ActiveStorage::Current.host в before_action hook:

class Items::FilesController < ApplicationController
  before_action do
    ActiveStorage::Current.host = request.base_url
  end
 end

За пределами контроллера используйте ActiveStorage::Current.set для предоставления хоста:

ActiveStorage::Current.set(host: "https://www.example.com") do
  item.file_attachments.first.service_url
end
...