不使用S3时,ActiveStorage service_url && rails_blob_path无法生成完整的URL

时间:2018-06-30 00:28:53

标签: rails-activestorage

我有一个基本的ActiveStorage设置,其中一个模型为has_many_attached :file_attachments。在其他地方的服务中,我试图生成一个要在主应用程序外部使用的链接(电子邮件,工作等)。

有了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?还是在哪里设置主机?

2 个答案:

答案 0 :(得分:9)

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

答案 1 :(得分:0)

我有类似的问题。由于容器设置,我不得不强制端口不同。就我而言,ActiveStorage完成的重定向包含错误的端口。对我来说,调整default_url_options的方法是有效的:

before_action :configure_active_storage_for_docker, if: -> { Rails.env.development? }

def configure_active_storage_for_docker
  Rails.application.routes.default_url_options[:port] = 4000
end