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?

d11wtq
quelle
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" }
Carlos Castillo
quelle
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:)

d11wtq
quelle
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 .

Nickh
quelle
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.

Joshua Pinter
quelle
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

ivanxuu
quelle
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.

pduersteler
quelle
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
Derek Fan
quelle
7

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

listing_url(listing, host: request.host)
Ablenkung
quelle
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.

Okomikeruko
quelle
1

Gehen Sie zu config / environment / test.rb.

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

milad rahmani
quelle
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.

Phoet
quelle
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'
Prabhakar Undurthi
quelle
0

Ich habe das Problem gelöst, indem ich environment.rb als konfiguriert habe

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

Sie müssen default_url_options für Action Mailer für jede Umgebung wie Entwicklung, Test, Staging und Produktion usw. festlegen.

Referenz: Fehlender Host zum Verknüpfen! Bitte geben Sie Folgendes an: Host-Parameter oder setzen Sie default_url_options [: host]

Zeeshan
quelle
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.

Ahmed J.
quelle