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

什么好主意吗?


当前回答

有趣的是,设置config.action_mailer.default_url_options对我没有帮助。此外,在我觉得不属于环境的地方摆弄与环境无关的设置对我来说并不满意。此外,我想要一个解决方案,在sidekiq/resque工人生成url时工作。

到目前为止,我的方法是进入config/environments/{development, production}.rb:

MyApp::Application.configure do
    # Stuff omitted...

    config.action_mailer.default_url_options = {
      # Set things here as usual
    }
end

MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

这适用于我在rails >= 3.2.x。

其他回答

有趣的是,设置config.action_mailer.default_url_options对我没有帮助。此外,在我觉得不属于环境的地方摆弄与环境无关的设置对我来说并不满意。此外,我想要一个解决方案,在sidekiq/resque工人生成url时工作。

到目前为止,我的方法是进入config/environments/{development, production}.rb:

MyApp::Application.configure do
    # Stuff omitted...

    config.action_mailer.default_url_options = {
      # Set things here as usual
    }
end

MyApp::Application.default_url_options = MyApp::Application.config.action_mailer.default_url_options

这适用于我在rails >= 3.2.x。

当您使用任何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方法

进入config/environments/test.rb

Rails.application.routes.default_url_options[:host] = 'localhost:3000'

我也犯了同样的错误。我正确地编写了所有内容,包括教程中的清单10.13。

Rails.application.configure do
.
.
.
config.action_mailer.raise_delivery_errors = true
config.action_mailer.delevery_method :test
host = 'example.com'
config.action_mailer.default_url_options = { host: host }
.
.
.
end

显然,把"example.com"换成了我的服务器url。

我在教程中忽略的是这一行:

重新启动开发服务器以激活配置…

所以对我来说,答案是关闭服务器,然后重新打开。

设置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引导我走上这条路。