我已经在谷歌上搜索了大约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而不是路径。

什么好主意吗?


当前回答

Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

在路上的某个地方。rb:)

其他回答

虽然在路由中添加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'
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

在路上的某个地方。rb:)

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

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

主机应该在每个环境的配置文件中指定。例如:

config/environments/development.rb

看看这个问题和这个问题。

当您使用任何listing_url方法时,将返回完整的URL(而不是通常的相对URL)。这就是为什么rails要求你提供主机,来计算整个URL。

如何分辨rails主机?你可以通过以下几种方式做到:

1.将此选项添加到每个环境:

[/config/development.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/test.rb]
config.action_mailer.default_url_options = { host: "localhost:3000" }
[/config/production.rb]
config.action_mailer.default_url_options = { host: "www.example.com" }

注意:如果你在rails引擎中工作,记得在引擎测试中对你的虚拟应用做同样的事情:path_to_your_engine/test/dummy/config/environments/*,因为当你测试引擎时,它是rails测试的对象。

2.将host选项添加到foo_url方法中,如下所示:

listing_url(listing, host: request.host) # => 'http://localhost:3000/listings/1'

3.不输出选项:only_path为true的主机。

listing_url(listing, only_path: true ) # => '/listings/1'   

恕我直言,我看不出这一点,因为在这种情况下,我会使用listing_path方法