Fehlender Host zum Verlinken! Bitte geben Sie Folgendes an: Host-Parameter oder setzen Sie default_url_options [: host]


183

Ich google jetzt seit ungefähr 90 Minuten und habe immer noch keine Antwort darauf. Wo setze ich default_url_options? Ich habe es bereits festgelegt config.action_mailer.default_url_options, um denselben Fehler an anderer Stelle zu beheben, aber jetzt wird dieser Fehler angezeigt, wenn ich versuche, einen URL-Helfer in einer RSpec-Spezifikation zu verwenden. Ich habe keine Ahnung, wo erwartet wird, dass default_url_options gesetzt werden.

 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)>'

Dieser Code hat nichts mit E-Mails / ActionMailer zu tun. Er benötigt lediglich eine URL anstelle eines Pfads.

Irgendwelche Ideen?


Was ist der Gastgeber überhaupt?
Jwan622

Antworten:


260

Sie müssen in jeder Umgebung die folgende Zeile hinzufügen:

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

Auf diese Weise kann es in allen Umgebungen funktionieren und von Umgebung zu Umgebung unterschiedlich sein. Beispielsweise:

development.rb

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

test.rb

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

Produktion.rb

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

16
Stellen Sie außerdem sicher, dass Sie Ihren Rails-Server neu starten, nachdem Sie dies hinzugefügt haben. Die Dateien unter config / werden nicht automatisch neu geladen.
Stenerson

3
Ich habe dies sehr ähnlich gemacht und das Festlegen der default_url_option für action_mailer hilft nicht. Der Anwendungsfall ist ähnlich wie folgt: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Machte dies; mit oder ohne www ... vor dem Hostnamen in der Produktion habe ich immer noch den gleichen Fehler. Die Route per @ d11wtq wurde hinzugefügt und es hat funktioniert. Gibt es eine Rails4-Änderung, die dieses Verhalten verursacht hat? Ich habe es vor dem Upgrade noch nie gesehen und seitdem nur in einem bestimmten Mail-Send (Gerät automatisiert).
JosephK

Kann bestätigen, dass dies in meinen Rails 4-Projekten nicht funktioniert. Das Einstellen in Routen ist einfach keine Option.
1.

4
Funktioniert nicht in Rails 5. Hinzugefügt default_url_options Rails.application.config.action_mailer.default_url_optionsund das hat den Trick gemacht, wie von einem anderen Kommentator vorgeschlagen
BooBailey

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

  # ... snip ...
end

Irgendwo in routes.rb:)


35
Nicht sehr gut, wenn Sie viele verschiedene Umgebungen mit unterschiedlichen URLs haben
Neil Middleton

2
Ja, was machst du, wenn du mehrere env-Domains hast?
Wejrowski

Vermutlich geben Sie es stattdessen einfach für jede URL an, entweder in der Routenkarte oder im Aufruf des URL-Hilfsprogramms : listing_url(listing, :host => "whatever.com").
d11wtq

14
In der Konfigurationsdatei für die jeweilige Umgebung füge ich diese benutzerdefinierte Option hinzu: config.domain = 'staging.myapp.com'(Ersetzen Sie natürlich jede Umgebung durch einen korrekten Domänennamen). Dann routes.rbbin ich frei zu benutzen default_url_options host: Rails.application.config.domainund es wird in jeder Umgebung funktionieren. Bitte.
Prathan Thananart

10
Ein besserer Ansatz wäre, innerhalb der Routendatei Folgendes zu tun : default_url_options Rails.application.config.action_mailer.default_url_options.
Siannopollo

42

Der Host sollte in der Konfigurationsdatei jeder Umgebung angegeben werden. Z.B:

config/environments/development.rb

Siehe diese Frage und diese Frage .


4
Danke, meiner
Meinung nach

1
Diese Antwort hilft nicht bei der Verwendung unterschiedlicher Domänen und behebt andere Probleme.
Ryan

1
@ Ryan Sie können nur Umgebungsvariablen verwenden, um das zu beheben
Courtsimas

35

Stellen Sie default_url_optionsIhre ein action_mailer.default_url_options.

In jedem Ihrer Umgebung Dateien (zB development.rb, production.rbusw.) können Sie die angeben , default_url_optionszu verwenden für action_mailer:

config.action_mailer.default_url_options = { host: 'lvh.me', port: '3000' }

Diese sind jedoch nicht festgelegt für MyApp:Application.default_url_options:

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

$ MyApp::Application.default_url_options
#=> {}

Das ist der Grund, warum Sie diesen Fehler in irgendetwas außerhalb von bekommen ActionMailer .

Sie können festlegen, dass Ihre Anwendungen das default_url_optionsverwenden, wofür Sie action_mailerin der entsprechenden Umgebungsdatei definiert haben ( development.rb,production.rb usw.).

Um die Dinge so trocken wie möglich zu halten, führen Sie dies in Ihrer config/environment.rbDatei aus, sodass Sie dies nur einmal tun müssen:

# 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

Wenn Sie jetzt Ihre App starten, entspricht Ihre gesamte Anwendung default_url_optionsIhrer 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"}

Hutspitze an @pduersteler, der mich auf diesen Weg geführt hat.


2
Das Einrichten von config/environment.rbwie beschrieben war der Schlüssel, damit mein Mailer in der Konsole funktioniert. Danke dir!
Eric D. Fields

@ EricD.Fields Gern geschehen, Eric! Ich finde das so nützlich, dass ich denke, es sollte in den Rails-Kern eingebaut werden.
Joshua Pinter

Das wäre Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsfür Rails 5.2+
Sandro L

Danke, @SandroL! Wir sind immer noch auf Rails 4.2 und haben es in späteren Versionen noch nicht getestet.
Joshua Pinter

Einige Leute empfehlen dies. Ich denke, es ist nur so, dass Leute aus historischen Gründen bereits action_mailer.default_url_options konfiguriert haben, aber ist es nicht logischer , dies basierend auf application.default_url_options festzulegen, als umgekehrt? Warum sollten Sie bei der Konfiguration der Funktionsweise Ihrer Website-Links eine gefälschte Mailer-Referenz verwenden?
Harry Wood

24

Wenn Sie welche verwenden listing_url Methode verwenden, wird die vollständige URL zurückgegeben (nicht wie gewohnt eine relative). Aus diesem Grund werden Sie von Rails nach dem Host gefragt, um die gesamte URL zu berechnen.

Wie können Sie Rails dem Host sagen? Sie können dies auf verschiedene Arten tun:

1. Hinzufügen dieser Option zu jeder Umgebung:

[/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" }

HINWEIS: Wenn Sie in einem Schienenmotor arbeiten, denken Sie daran, dasselbe für Ihre Dummy-App in den Motortests zu tun:path_to_your_engine/test/dummy/config/environments/* testen, ist es das, gegen das Schienen testen.

2. Fügen Sie die Host-Option wie folgt zur foo_url-Methode hinzu:

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

3. Geben Sie den Host nicht mit der Option aus:only_path to true .

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

IMHO sehe ich den Punkt in diesem Fall nicht, weil ich in diesem Fall das verwenden würde listing_path Methode verwenden würde


Schritt 1 funktioniert immer für mich und heute, mit dem Raffinerie-CMS-Juwel, rette mich nur Schritt 2. Danke für den Kommentar.
Lucianosousa

15

Lustige Sache, diese Einstellung config.action_mailer.default_url_options hilft mir nicht. Außerdem war es für mich nicht zufriedenstellend, an Orten mit umweltunabhängigen Einstellungen herumzuspielen, von denen ich glaubte, dass sie nicht dazu gehören. Außerdem wollte ich eine Lösung, die beim Generieren von URLs in Sidekiq / Resque-Workern funktioniert.

Mein bisheriger Ansatz, der Folgendes betrifft 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

Dies funktioniert bei mir in Schienen> = 3.2.x.


1
Dies und nur dies funktionierte, um den Mailer dazu zu bringen, die URL einzuschließen, aber es bricht andere link_to-Funktionen in meiner App.

1
Tolles Denken, @pduesteler! Ich bin noch einen Schritt weiter gegangen und konnte dazu nur eine Zeile in die config/environment.rbDatei einfügen. Und eine Antwort, die ins Detail geht: stackoverflow.com/a/48529627/293280 Vielen Dank, dass Sie mich in diese Richtung weisen.
Joshua Pinter

9

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

In der Entwicklung.rb / test.rb kann wie folgt präziser sein:

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

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

7

Sie können den Host jederzeit als Parameter an den URL-Helfer übergeben:

listing_url(listing, host: request.host)

Hinweis: Sie können auch einen Port hinzufügenlisting_url(listing, host: request.host, port: 3000)
drhenner

Aber was ist, wenn Sie den Anforderungskontext nicht haben? Wie in den meisten anderen Dingen als einem Controller?
Courtsimas


1

Ich hatte den gleichen Fehler. Ich hatte alles richtig geschrieben, einschließlich Listing 10.13 aus dem Tutorial.

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

offensichtlich mit "example.com" ersetzt durch meine Server-URL.

Was ich im Tutorial beschönigt hatte, war diese Zeile:

Nach dem Neustart des Entwicklungsservers , um die Konfiguration zu aktivieren ...

Die Antwort für mich war also, den Server aus- und wieder einzuschalten.


1

Gehen Sie zu config / environment / test.rb.

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


2
Die Antwort benötigt weitere Informationen. Bitte beschreiben Sie, was Sie tatsächlich als Lösung vorschlagen.
Levi Roberts

1
Hier finden Sie einige nützliche Tipps zur Beantwortung . Ich finde sie nützlich, um darauf zu verweisen.
Garrett Motzner

1

Nur für den Fall, dass jemand diese Suche nach Fehlern in Bezug auf ActiveStorage findet:

Wenn Sie eine Controller-Aktion haben, bei der Sie Upload-URLs usw. mit dem lokalen Disc-Service generieren möchten (höchstwahrscheinlich in einer Testumgebung), müssen Sie dies include ActiveStorage::SetCurrentim Controller tun, damit Sie blob.service_url_for_direct_uploadordnungsgemäß arbeiten können.


Danke dir! Die Verwendung außerhalb eines Controllers (GraphQL Direct Upload Mutation) musste also etwas angepasst werden, funktioniert aber. Ich habe danach gesucht, nochmals vielen Dank @phoet :)
Stan

0

Das Hinzufügen der default_url in Routen ist jedoch nicht die richtige Lösung, funktioniert jedoch in einigen Fällen.

Sie müssen die default_url in jeder Umgebung festlegen (Entwicklung, Test, Produktion).

Sie müssen diese Änderungen vornehmen.

    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

Die obige Antwort hat bei mir nicht funktioniert, zumindest nicht so, wie ich es wollte. Ich erkannte config.action_mailer.default_url_options = { host: "localhost", port: 3000 } nach der Installation von Gerät. Hoffe, es wird jemandem mit dem gleichen Problem helfen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.