Rails ActiveStorage rails_blob_path 生成无效 url 且开始时缺少 /rails

Rails ActiveStorage rails_blob_path generating invalid url with missing /rails in start

我在: Rails: 6.0.1
Ruby: 2.6.5

并且我在我的一个序列化程序中使用 Rails.application.routes.url_helpers.rails_blob_path 助手来生成 pdf 文件的路径。它在开发中一直运作良好。生成 url 如: /rails/active_storage/blobs/:signed_id/*filename
符合预期。

但在生产中,同一个助手生成错误的 url,格式为:
/active_storage/blobs/:signed_id/*filename
注意开头缺少的 /rails 部分。

访问 url 时,这显然会导致没有路由匹配错误。

我一直在努力挖掘和寻找线索,暂时我已经在我的 routes.rb

中添加了以下内容
get '/active_storage/blobs/:signed_id/*filename', to: 'active_storage/blobs#show'

我知道这只是一个 hack,但它现在有效。我正在寻找真正的原因并解决这个问题。

所以我正在做一些测试和试验,我注意到这发生在我的生产控制台中:

Rails.application.routes.url_helpers.url_for(Record.last.file)
=> "https://mywebsite.com//rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBDQT09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--8994a079b16e683a18ef1be83a6ae7f5c3/filename.pdf"

注意 //rails 部分,它是无效的,因为它有双正斜杠。这引导我找到解决方案。

解决方案

我的 config/environment.rb 文件中有这个:

Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options

production.rb 中的默认 url 选项看起来像:

config.action_mailer.default_url_options = { host: ENV['SERVER_URL'] }

SERVER_BASE_URL 是罪魁祸首,当我将其更改为 https://mywebsite.com 并重新启动服务器时,它被设置为:https://mywebsite.com/。轰!

尽管我不是很清楚为什么会出现这种行为,以及这是否是一个错误。但经过数小时的努力,这对我有用。