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


183

我已经搜索了大约90分钟,但仍然没有答案。我在哪里设置default_url_options?我已经将其设置为config.action_mailer.default_url_options解决其他地方的相同错误,但是现在尝试在RSpec规范中使用URL辅助程序时遇到此错误。我不知道在哪里设置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)>'

此代码与emails / ActionMailer无关,只是需要一个URL而不是路径。

有任何想法吗?


主机是什么?
Jwan622'9

Answers:


260

您需要在每个环境中添加以下行:

config.action_mailer.default_url_options = { :host => "yourhost" }

这样,它可以在所有环境中工作,并且因环境而异。例如:

development.rb

config.action_mailer.default_url_options = { :host => "dev.yourhost.com" }

test.rb

config.action_mailer.default_url_options = { :host => "test.yourhost.com" }

production.rb

config.action_mailer.default_url_options = { :host => "www.yourhost.com" }

16
添加后,还请确保重新启动Rails服务器。config /下的文件不会自动重新加载。
Stenerson

3
我做的非常相似,为action_mailer设置default_url_option将无济于事。用例是类似于:Rails.application.routes.url_helpers.message_image_url(2)
博提

1
做过这个; 有或没有www ...在生产中为主机名加上前缀,我仍然遇到相同的错误。添加了每个@ d11wtq的路由,并且有效。是否存在导致此行为的Rails4更改?从那以后,我从未在升级之前看到它,仅在一次特定的邮件发送(设计自动化)中看到过它。
JosephK 2014年

可以确认这在我的Rails 4项目中不起作用。在路由中设置它根本是没有选择的。
2016年

4
在Rails 5中不起作用。default_url_options Rails.application.config.action_mailer.default_url_options不过,正如另一位评论者所建议的那样
BooBailey

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

  # ... snip ...
end

在某处routes.rb:)


35
如果您拥有许多具有不同URL的不同环境,那就不是很好
Neil Middleton

2
是的,如果您有多个环境域名,您该怎么办?
wejrowski12'3

大概您只是在路由映射或url helper调用中为每个URL指定了它listing_url(listing, :host => "whatever.com")
d11wtq 2012年

14
在每个相应环境的配置文件中,我添加了此自定义选项:(config.domain = 'staging.myapp.com'当然,请为每个环境替换一个正确的域名)。然后,routes.rb我可以自由使用default_url_options host: Rails.application.config.domain它,并且可以在任何环境中使用。别客气。
Prathan Thananart

10
更好的方法是在route文件中执行以下操作:default_url_options Rails.application.config.action_mailer.default_url_options
siannopollo 2014年

42

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

config/environments/development.rb

看到这个问题这个问题


4
谢谢,恕我直言,这是比使用route.draw的答案更好的答案
joelparkerhenderson

1
使用不同的域并解决其他问题时,此答案无济于事。
瑞安

1
@Ryan您可以使用环境变量来解决此问题
courtsimas

35

设置default_url_options为使用您的action_mailer.default_url_options

在每个环境文件(例如development.rbproduction.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.rbproduction.rb,等)。

为了使内容尽可能保持DRY,请在config/environment.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致谢,以我走这条路。


2
设置config/environment.rb您所描述的是使我的邮件程序在控制台中工作的关键。谢谢!
埃里克·菲尔德

@ EricD.Fields非常欢迎您,Eric!我觉得这很有用,我认为它应该内置在Rails核心中。
Joshua Pinter

这将是Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options为Rails 5.2+
桑德罗大号

谢谢@SandroL!我们仍然在Rails 4.2上,因此尚未在更高版本上进行测试。
约书亚·品特

一些人推荐这个。我想这只是人们往往已经配置出于历史原因action_mailer.default_url_options,不过,是不是更符合逻辑组基于application.default_url_options而不是周围的其他方式?在配置网站链接的工作方式时,为什么要引用虚假邮件参考?
哈里·伍德

24

当您使用任何listing_url方法时,将返回完整的URL(不是通常的相对地址)。这就是Rails要求您提供主机以计算整个URL的原因。

你怎么能告诉主机?您可以通过以下几种方式进行操作:

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 to true

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

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


第1步始终对我有用,而今天,仅使用第2步中的fineryry-cms gem就可以帮助我。感谢您的评论。
lucianosousa

15

有趣的是,该设置config.action_mailer.default_url_options对我没有帮助。另外,在我觉得不属于环境的地方乱搞环境设置令我不满意。另外,我想要一个在sidekiq / resque worker中生成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

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


1
这并且仅此一项可以使邮件程序包含URL,但它破坏了我应用程序中的其他link_to函数。

1
好主意,@ pduesteler!实际上,我进一步迈出了这一步,并且能够在config/environment.rb文件中仅添加一行来执行此操作。并添加了详细的答案:stackoverflow.com/a/48529627/293280感谢您指出我这个方向。
约书亚·品特

9

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

在developemnt.rb / test.rb中,可以更加简洁如下:

Rails.application.configure do
  # ... other config ...

  routes.default_url_options[:host] = 'localhost:3000'
end

7

您始终可以将host作为参数传递给URL帮助器:

listing_url(listing, host: request.host)

注意:您也可以添加端口listing_url(listing, host: request.host, port: 3000)
drhenner 2013年

但是,如果您没有请求上下文,该怎么办?像除控制器以外的大多数其他东西一样?
courtsimas


1

我有同样的错误。我已经正确地编写了所有内容,包括本教程中的代码清单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”替换了我的服务器网址。

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

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

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



1

以防万一有人发现此搜索有关ActiveStorage的错误:

如果您有一个控制器操作,您想使用本地磁盘服务生成上载URL等(最有可能在测试环境中),则需要include ActiveStorage::SetCurrent在控制器中才能blob.service_url_for_direct_upload正常工作。


谢谢!在控制器之外使用此控件(GraphQL直接上载突变),因此必须对其进行一些调整,但是可以。我一直在寻找,再次感谢@phoet :)
Stan

0

尽管在路由中添加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'


0

上面的答案对我不起作用,至少不是我想要的那样。config.action_mailer.default_url_options = { host: "localhost", port: 3000 } 安装装置后我才意识到 。希望它可以帮助遇到同样问题的人。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.