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

d11*_*wtq 171 rspec ruby-on-rails

我现在谷歌搜索大约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)>'
Run Code Online (Sandbox Code Playgroud)

这段代码与emails/ActionMailer无关,它恰好需要一个URL而不是一个路径.

有任何想法吗?

Car*_*llo 245

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

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

这样,它可以在所有环境中工作,并且可以在环境与环境之间有所不同.例如:

development.rb

config.action_mailer.default_url_options = { :host => "dev.yourhost.com" }
Run Code Online (Sandbox Code Playgroud)

test.rb

config.action_mailer.default_url_options = { :host => "test.yourhost.com" }
Run Code Online (Sandbox Code Playgroud)

production.rb

config.action_mailer.default_url_options = { :host => "www.yourhost.com" }
Run Code Online (Sandbox Code Playgroud)

  • 另外,请确保在添加之后重新启动rails服务器.config /下的文件不会自动重新加载. (14认同)
  • 我已经完成了与此类似的操作,并为action_mailer设置default_url_option将无济于事.用例类似于:Rails.application.routes.url_helpers.message_image_url(2) (3认同)
  • 做过这个; 带或不带 www... 在生产中添加主机名前缀,我仍然遇到相同的错误。添加了每个@d11wtq 的路由,并且它起作用了。是否有一些 Rails4 更改导致了这种行为?我在升级之前从未见过它,而且只在一次特定的邮件发送(设计自动化)中看到过。 (2认同)
  • 在Rails 5中不起作用。添加了default_url_options Rails.application.config.action_mailer.default_url_options` (2认同)

d11*_*wtq 66

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

  # ... snip ...
end
Run Code Online (Sandbox Code Playgroud)

routes.rb:)的某个地方

  • 如果您有许多具有不同URL的不同环境,那就不太好了 (31认同)
  • 在每个相应环境的配置文件中,我添加了这个自定义选项:`config.domain ='staging.myapp.com''(当然,为每个env替换正确的域名).然后在`routes.rb`中我可以自由使用`default_url_options host:Rails.application.config.domain`,它可以在任何环境中使用.别客气. (14认同)
  • 更好的方法是在routes文件中执行以下操作:`default_url_options Rails.application.config.action_mailer.default_url_options`. (8认同)
  • 是的,如果你有多个env域名,你会怎么做? (2认同)

nic*_*ckh 42

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

config/environments/development.rb
Run Code Online (Sandbox Code Playgroud)

看到这个问题这个问题.

  • 谢谢,恕我直言,这是一个比使用routes.draw的答案更好的答案 (4认同)

Jos*_*ter 30

设置default_url_options使用你的action_mailer.default_url_options.

在每个环境文件(例如development.rb,production.rb等)中,您可以指定default_url_options要用于action_mailer:

config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }
Run Code Online (Sandbox Code Playgroud)

但是,这些不适用于MyApp:Application.default_url_options:

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

$ MyApp::Application.default_url_options
#=> {}
Run Code Online (Sandbox Code Playgroud)

这就是为什么你在外面的任何东西都得到了这个错误ActionMailer.

您可以设置应用程序的default_url_options使用您定义的内容action_mailer在适当的环境文件(development.rb,production.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
Run Code Online (Sandbox Code Playgroud)

现在,当您启动应用程序时,您的整个应用程序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"}
Run Code Online (Sandbox Code Playgroud)

@pduersteler提示,让我沿着这条路走下去.

  • 如您所述,设置config / environment.rb是使我的邮件程序在控制台中工作的关键。谢谢! (2认同)
  • 对于 Rails 5.2+,这将是 `Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options` (2认同)

iva*_*xuu 24

当您使用任何listing_url方法时,将返回完整的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" }
Run Code Online (Sandbox Code Playgroud)

注意:如果您在rails引擎内部工作,请记住在引擎测试中为您的虚拟应用程序执行相同的操作:path_to_your_engine/test/dummy/config/environments/*因为当您测试引擎时,它正在测试哪些rails.

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

listing_url(listing, host: request.host) # => 'http://localhost:3000/listings/1'
Run Code Online (Sandbox Code Playgroud)

3.不使用选项输出主机:only_path to true.

listing_url(listing, only_path: true ) # => '/listings/1'   
Run Code Online (Sandbox Code Playgroud)

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


pdu*_*ler 14

有趣的是,那个设置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
Run Code Online (Sandbox Code Playgroud)

这适用于rails> = 3.2.x.


Ahm*_* J. 8

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


Der*_*Fan 7

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
Run Code Online (Sandbox Code Playgroud)


Und*_*ion 6

您始终可以将主机作为参数传递给URL帮助程序:

listing_url(listing, host: request.host)
Run Code Online (Sandbox Code Playgroud)


小智 6

转到 config/environments/test.rb

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

  • 答案需要更多信息。请描述您实际提出的解决方案是什么。 (2认同)