it-swarm.com.de

Fehlender Host zum Verlinken! Bitte geben Sie an: Host parameter oder set default_url_options [: Host]

Ich google jetzt seit ungefähr 90 Minuten und habe noch keine Antwort darauf. Wo setze ich default_url_options? Ich habe es schon eingestellt für config.action_mailer.default_url_options, um denselben Fehler an einer anderen Stelle zu beheben, aber jetzt wird dieser Fehler angezeigt, wenn versucht wird, einen URL-Helfer in einer RSpec-Spezifikation zu verwenden. Ich habe keine Ahnung, wo default_url_options gesetzt werden soll.

 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. Statt eines Pfades wird lediglich eine URL benötigt.

Irgendwelche Ideen?

167
d11wtq
Your::Application.routes.draw do
  default_url_options :Host => "example.com"

  # ... snip ...
end

Irgendwo in routes.rb :)

64
d11wtq

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

production.rb

config.action_mailer.default_url_options = { :Host => "www.yourhost.com" }
243
Carlos Castillo

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

config/environments/development.rb

Siehe diese Frage und diese Frage .

39
nickh

Stellen Sie default_url_options Ein, um Ihren action_mailer.default_url_options Zu verwenden.

In jeder Ihrer Umgebungsdateien (z. B. development.rb, production.rb Usw.) können Sie den default_url_options Angeben, der für action_mailer Verwendet werden soll:

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

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

$ 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 außerhalb von ActionMailer erhalten.

Sie können den default_url_options Ihrer Anwendung so einstellen, dass er das verwendet, was Sie für action_mailer In der entsprechenden Umgebungsdatei (development.rb, production.rb Usw.) definiert haben.

Führen Sie dies in Ihrer config/environment.rb - Datei aus, um die Funktion DRY) möglichst beizubehalten, sodass Sie dies nur einmal ausführen 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 der default_url_options Ihrer gesamten Anwendung Ihrem 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"}

Hat Tipp an @ pduersteler , um mich auf diesem Weg zu führen.

27
Joshua Pinter

Wenn Sie eine listing_url - Methode verwenden, wird die vollständige URL zurückgegeben (keine relative wie üblich). Deshalb fordert Rails Sie auf, den Host anzugeben, um die gesamte URL zu berechnen.

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

1.Zu jeder Umgebung diese Option hinzufügen:

[/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 Rails-Motor arbeiten , denken Sie daran, dasselbe für Ihre Dummy-App in den Motortests zu tun: path_to_your_engine/test/dummy/config/environments/*, Denn wenn Sie den Motor testen, wird er mit Rails) verglichen.

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

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

. Den Host nicht mit der Option :only_path to true Ausgeben.

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

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

24
ivanxuu

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

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

Das funktioniert bei mir in Rails> = 3.2.x.

14
pduersteler

Sie können dem URL-Helfer immer Host als Parameter übergeben:

listing_url(listing, Host: request.Host)
6
Undistraction

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

In der Datei development.tb/test.tb kann Folgendes angegeben werden:

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

  routes.default_url_options[:Host] = 'localhost:3000'
end
5
Derek Fan

Sie können die Standard-URL-Optionen im Application Controller festlegen:

class ApplicationController < ActionController::Base
  def default_url_options
    {:locale => I18n.locale}
  end
end

http://guides.rubyonrails.org/action_controller_overview.html#default_url_options

3
RicRoberts

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 wurde "example.com" durch meine Server-URL ersetzt.

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

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

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

1
Okomikeruko

gehen Sie zu config/surroundings/test.rb

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

1
milad rahmani

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

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

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
Prabhakar