我已经在谷歌上搜索了大约90分钟,仍然没有答案。我在哪里设置default_url_options?我已经设置了config.action_mailer.default_url_options来解决其他地方的这个错误,但现在我在尝试使用RSpec规范内的URL helper时得到了这个错误。我不知道它在哪里期望default_url_options被设置。

 Failure/Error: listing_url(listing).should match(/\/\d+-\w+$/)
 RuntimeError:
   Missing host to link to! Please provide :host parameter or set default_url_options[:host]
 # ./spec/routing/listing_routing_spec.rb:9:in `block (3 levels) in <top (required)>'

这段代码与电子邮件/ActionMailer无关,它只是需要一个URL而不是路径。

什么好主意吗?


当前回答

以防有人发现这个搜索有关ActiveStorage的错误:

如果你有一个控制器动作,你想用本地磁盘服务生成upload-urls等(很可能在测试环境中),你需要在控制器中包含ActiveStorage::SetCurrent以允许blob。Service_url_for_direct_upload才能正常工作。

其他回答

上面的答案对我不起作用,至少不是我想要的。 我意识到 Config.action_mailer.default_url_options ={主机:"localhost",端口:3000} 安装设备后。 希望对有同样问题的人有所帮助。

设置default_url_options以使用action_mailer.default_url_options。

在每个环境文件中(例如:development。rb、生产。Rb等),你可以指定default_url_options用于action_mailer:

config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }

然而,这些都没有设置MyApp:Application.default_url_options:

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {}

这就是为什么你在ActionMailer之外的任何地方都会得到这个错误。

您可以设置应用程序的default_url_options,以使用您在适当的环境文件中为action_mailer定义的选项(development。rb、生产。rb,等等)。

为了尽可能保持DRY,请在配置/环境中执行此操作。Rb文件,所以你只需要这样做一次:

# Initialize the rails application
MyApp::Application.initialize!

# Set the default host and port to be the same as Action Mailer.
MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

现在当你启动你的应用程序,你的整个应用程序的default_url_options将匹配你的action_mailer.default_url_options:

$ MyApp::Application.config.action_mailer.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

$ MyApp::Application.default_url_options
#=> {:host=>"lvh.me", :port=>"3000"}

感谢@pduersteler引导我走上这条路。

你可以在应用程序控制器中设置默认的url选项:

class ApplicationController < ActionController::Base
  def default_url_options
    {:locale => I18n.locale}
  end
end

http://guides.rubyonrails.org/action_controller_overview.html#default_url_options

虽然在路由中添加default_url不是正确的解决方案,但它在某些情况下是可行的。

您必须在每个环境(开发、测试、生产)中设置default_url。

你需要做出这些改变。

    config/environments/development.rb
     config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

 config/environments/test.rb
      config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

  config/environments/development.rb
     config.action_mailer.default_url_options = 
      { :host => 'your-host-name' }  #if it is local then 'localhost:3000'

我通过配置环境解决了这个问题。rb作为

YourApp::Application.default_url_options = YourApp::Application.config.action_mailer.default_url_options

你需要为action mailer设置default_url_options针对每个环境,如开发、测试、登台和生产等。

参考:缺少要链接的主机!请提供:host参数或设置default_url_options[:host]