我有一个带有has_many_attached :file_attachments
型号的基本ActiveStorage设置。在其他地方的服务中,我试图生成一个要在主应用程序外部使用的链接(电子邮件,工作等)。
使用S3,我可以执行以下操作:item.file_attachments.first.service_url
,我获得了指向S3 bucket + object的适当链接。
我无法使用Rails指南中规定的方法: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?或在哪里设置主机?
最佳答案
Active Storage的磁盘服务希望在ActiveStorage::Current.host
中找到用于生成URL的主机。
手动调用ActiveStorage::Blob#service_url
时,请确保已设置ActiveStorage::Current.host
。如果从控制器调用它,则可以子类ActiveStorage::BaseController
。如果不是这样,请在ActiveStorage::Current.host
挂钩中设置before_action
:
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