ChatGPT解决这个技术问题 Extra ChatGPT

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

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

有任何想法吗?

楼主到底是什么东西?

p
p.matsinopoulos

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

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

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

发展.rb

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

测试.rb

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

生产.rb

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

还要确保在添加后重新启动 Rails 服务器。 config/ 下的文件不会自动重新加载。
我所做的与此非常相似,并且为 action_mailer 设置 default_url_option 将无济于事。用例类似于:Rails.application.routes.url_helpers.message_image_url(2)
做过这个;无论有没有 www... 在生产中为主机名添加前缀,我仍然遇到同样的错误。根据@d11wtq 添加了路线,并且有效。是否有一些 Rails4 更改导致了这种行为?在升级之前我从未见过它,并且只在一个特定的邮件发送(设计自动化)中,因为。
可以确认这在我的 Rails 4 项目中不起作用。在路线中设置它根本是没有选择的。
不能在 Rails 5 中工作。虽然添加了 default_url_options Rails.application.config.action_mailer.default_url_options 并且这样做了,正如另一位评论者所建议的那样
n
ndnenkov
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

routes.rb 中的某处 :)


如果您有许多具有不同 URL 的不同环境,则不是很好
是的,如果您有多个 env 域,您会怎么做?
大概您只需在路由映射或 url 帮助程序调用中为每个 URL 指定它:listing_url(listing, :host => "whatever.com")
在每个环境的配置文件中,我添加了这个自定义选项:config.domain = 'staging.myapp.com'(当然,为每个环境替换一个正确的域名)。然后在 routes.rb 中,我可以自由使用 default_url_options host: Rails.application.config.domain,它可以在任何环境中工作。别客气。
更好的方法是在路由文件中执行以下操作:default_url_options Rails.application.config.action_mailer.default_url_options
n
ndnenkov

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

config/environments/development.rb

请参阅 this questionthis question


谢谢,恕我直言,这比使用 routes.draw 的答案更好
当使用不同的域并解决其他问题时,此答案无济于事。
@Ryan你可以使用环境变量来解决这个问题
J
Joshua Pinter

设置 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 设置为使用您在相应环境文件(development.rbproduction.rb 等)中为 action_mailer 定义的内容。

为了尽可能保持干燥,请在您的 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 致敬,感谢他带领我走上这条道路。


如您所述设置 config/environment.rb 是让我的邮件程序在控制台中工作的关键。谢谢!
@EricD.Fields 不客气,埃里克!我发现这非常有用,我认为它应该内置到 Rails 核心中。
对于 Rails 5.2+,这将是 Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options
谢谢,@SandroL!我们仍在使用 Rails 4.2,因此尚未在更高版本上进行测试。
几个人推荐这个。我想这只是因为历史原因人们倾向于已经配置了 action_mailer.default_url_options,但是基于 application.default_url_options 而不是相反设置它不是更合乎逻辑吗?为什么在配置您的网站链接的工作方式时涉及虚假邮件参考?
i
ivanxuu

当您使用任何 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.将主机选项添加到 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 步总是对我有用,今天,使用炼油厂 cms gem 只需第 2 步救我。感谢您的评论。
非常有用的答案,因为在您使用 Rails 引擎时提到了场景!就我而言,我在尝试执行使用引擎内部模型的 rake 任务时遇到了错误。我像这样将我的 action_mailer 配置加载到引擎中,最终能够运行该任务。 MyEngine::Engine.config.action_mailer.default_url_options = Rails.application.config.action_mailer.default_url_options MyEngine::Engine.routes.default_url_options = Rails.application.config.action_mailer.default_url_options
D
Derek Fan

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

p
pdu

有趣的是,设置 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。


只有这样才能让邮件程序包含 URL,但它会破坏我的应用程序中的其他 link_to 功能。
伟大的想法,@pduesteler!我实际上更进一步,并且能够在 config/environment.rb 文件中添加一行来执行此操作。并添加了详细的答案:stackoverflow.com/a/48529627/293280 感谢您向我指出这个方向。
U
Undistraction

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

listing_url(listing, host: request.host)

注意:您也可以添加端口 listing_url(listing, host: request.host, port: 3000)
但是如果你没有请求上下文怎么办?像控制器以外的大多数事情一样?
m
milad rahmani

转到配置/环境/test.rb

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


答案需要更多信息。请描述您实际提出的解决方案是什么。
以下是有关 How to Answer 的一些有用提示。我觉得参考它们很有用。
p
phoet

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

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


谢谢!在控制器外部使用它(GraphQL 直接上传突变),所以不得不稍微调整一下,但可以。我一直在寻找这个,再次感谢@phoet :)
A
Ahmed J.

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


R
RicRoberts

您可以在应用程序控制器中设置默认 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


这对于 Rails 4 来说是一个很好的解决方案,因为它允许您在必要时设置特定于控制器的选项。
O
Okomikeruko

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

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

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

所以我的答案是关闭服务器然后重新打开。


P
Prabhakar Undurthi

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

z
zeeshan

我通过将 environment.rb 配置为

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

您需要针对每个环境(如开发、测试、登台和生产等)为动作邮件设置 default_url_options。

参考:Missing host to link to! Please provide :host parameter or set default_url_options[:host]


B
B Seven

不想改变其他环境的行为,所以我使用了:

发展.rb

Rails.application.configure do
...
end

Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_options

在 Rails 6 中工作。