web-dev-qa-db-ja.com

ActiveStorage service_url && Rails_blob_pathは、S3を使用していないときに完全なURLを生成できません

_has_many_attached :file_attachments_という1つのモデルで基本的なActiveStorageをセットアップしています。他のサービスでは、メインアプリの外部で使用するリンク(メール、ジョブなど)を生成しようとしています。

S3を運用環境で使用すると、_item.file_attachments.first.service_url_を実行でき、S3バケット+オブジェクトへの適切なリンクを取得できます。

Rails guides: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を取得するにはどうすればよいですかまたはホストをどこに設定しますか?

12
tgf

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
18
George Claghorn