Host mancante a cui collegarsi! Fornisci: parametro host o imposta default_url_options [: host]


183

Ho cercato su Google per circa 90 minuti e non ho ancora una risposta a questo. Dove devo impostare default_url_options? L'ho già impostato per config.action_mailer.default_url_optionsrisolvere lo stesso bug altrove, ma ora visualizzo questo errore quando provo a utilizzare un helper URL all'interno di una specifica RSpec. Non ho idea di dove debba essere impostato 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)>'

Questo codice non ha nulla a che fare con le e-mail / ActionMailer, è solo necessario un URL anziché un percorso.

Qualche idea?


Qual è l'host comunque?
Jwan622,

Risposte:


260

È necessario aggiungere la seguente riga in ogni ambiente:

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

In questo modo, può funzionare in tutti gli ambienti e potrebbe essere diverso da ambiente a ambiente. Per esempio:

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

16
Assicurati anche di riavviare il server rails dopo averlo aggiunto. I file in config / non vengono ricaricati automaticamente.
Stenerson,

3
Ho fatto molto simile a questo e l'impostazione di default_url_option per action_mailer non sarà di aiuto. Il caso d'uso è simile al seguente: Rails.application.routes.url_helpers.message_image_url (2)
Boti

1
Fatto; con o senza www ... prefisso il nome host in produzione, ho ancora ricevuto lo stesso errore. Aggiunto il percorso per @ d11wtq e ha funzionato. C'è qualche modifica di Rails4 che ha causato questo comportamento? Da allora non l'ho mai visto prima dell'aggiornamento, e solo in un particolare invio di posta (ideato automaticamente).
JosephK,

Posso confermare che questo non funziona nei miei progetti Rails 4. Impostarlo nei percorsi non è semplicemente un'opzione.
1616

4
Non funziona in Rails 5. Aggiunto default_url_options Rails.application.config.action_mailer.default_url_optionsperò e che ha funzionato, come suggerito da un altro commentatore
BooBailey,

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

  # ... snip ...
end

Da qualche parte in routes.rb:)


35
Non molto bene se hai molti ambienti diversi con URL diversi
Neil Middleton il

2
Sì, cosa fai se hai più domini env?
wejrowski

Presumibilmente basta specificarlo per ogni URL, invece, sia nella mappa del percorso, o l'helper invocazione url: listing_url(listing, :host => "whatever.com").
d11wtq

14
Nel file di configurazione per ogni rispettivo ambiente, aggiungo questa opzione personalizzata: config.domain = 'staging.myapp.com'(ovviamente sostituisco un nome di dominio corretto per ogni env). Quindi in routes.rbsono libero di usare default_url_options host: Rails.application.config.domaine funzionerà in qualsiasi ambiente. Prego.
Prathan Thananart,

10
Un approccio migliore sarebbe quello di, all'interno del file percorsi, fare questo: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo,

42

L'host deve essere specificato nel file di configurazione di ciascun ambiente. Per esempio:

config/environments/development.rb

Vedi questa domanda e questa domanda .


4
Grazie, IMHO questa è una risposta migliore della risposta che utilizza route.draw
joelparkerhenderson

1
Questa risposta non aiuta quando si utilizzano domini diversi e risolve altri problemi.
Ryan,

1
@Ryan puoi semplicemente usare le variabili ambientali per risolvere il problema
cortei

35

Imposta default_url_optionsper usare il tuoaction_mailer.default_url_options .

In ciascuno dei tuoi file di ambiente (ad es development.rb. production.rb, Ecc.) Puoi specificare il default_url_optionsda usare per action_mailer:

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

Tuttavia, questi non sono impostati per MyApp:Application.default_url_options:

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

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

Ecco perché stai ottenendo questo errore in qualsiasi cosa al di fuori di ActionMailer .

Puoi impostare l'applicazione default_url_optionsin modo che utilizzi ciò che hai definito action_mailernel file di ambiente appropriato ( development.rb,production.rb , ecc).

Per mantenere le cose il più DRY possibile, fallo nel tuo config/environment.rbfile in modo da farlo solo una volta:

# 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

Ora quando avvii la tua app, l'intera applicazione default_url_optionscorrisponderà a 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"}

Punta a Hat su @pduersteler per avermi guidato lungo questo percorso.


2
Configurare config/environment.rbcome descritto era la chiave per far funzionare il mio mailer nella console. Grazie!
Eric D. Fields,

@ EricD.Fields Prego, Eric! Lo trovo così utile che penso che dovrebbe essere integrato nel core di Rails.
Joshua Pinter,

Questo sarebbe Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionsper Rails 5.2+
Sandro L

Grazie @SandroL! Siamo ancora su Rails 4.2, quindi non abbiamo ancora testato su versioni successive.
Joshua Pinter,

Alcune persone lo raccomandano. Credo che sia giusto che le persone tendono ad avere action_mailer.default_url_options già configurate per ragioni storiche, ma non è più logico set che basa su application.default_url_options, piuttosto che il contrario? Perché coinvolgere un riferimento mailer falso quando si configura come funzionano i collegamenti al tuo sito Web?
Harry Wood,

24

Quando si utilizza un listing_urlmetodo, verrà restituito l'URL completo (non uno relativo come di consueto). Ecco perché rails ti sta chiedendo l'host per calcolare l'intero URL.

Come si può dire a rails l'host? Puoi farlo in diversi modi:

1. Aggiunta di questa opzione a ciascun ambiente:

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

NOTA: se lavori all'interno di un motore di rotaie ricorda di fare lo stesso per la tua app fittizia all'interno dei test del motore:path_to_your_engine/test/dummy/config/environments/* perché quando collaudi il motore è quello contro cui stanno testando le rotaie.

2. Aggiungi l'opzione host al metodo foo_url in questo modo:

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

3.Non emettere l'host con l'opzione:only_path to true .

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

IMHO Non vedo il punto su questo perché in questo caso userei il listing_pathmetodo


Il passaggio 1 funziona sempre per me e oggi, usando la gemma della raffineria-cms, solo il passaggio 2 mi salva. Grazie per il commento.
lucianosousa,

15

Cosa divertente, quell'ambientazione config.action_mailer.default_url_options non mi aiuta. Inoltre, scherzare con impostazioni indipendenti dall'ambiente in luoghi in cui mi sembrava che non appartenesse non era soddisfacente per me. Inoltre, volevo una soluzione che funzionasse durante la generazione di URL nei lavoratori sidekiq / resque.

Il mio approccio finora, che riguarda 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

Questo funziona per me in rotaie> = 3.2.x.


1
Questo e solo questo ha funzionato per far sì che il mailer includesse l'URL, ma interrompe altre funzioni link_to nella mia app.

1
Ottimo pensiero, @pduesteler! In realtà ho fatto un ulteriore passo avanti e sono stato in grado di aggiungere solo una riga nel config/environment.rbfile per farlo. E aggiunta una risposta che va nel dettaglio: stackoverflow.com/a/48529627/293280 Grazie per avermi indicato in questa direzione.
Joshua Pinter,

9

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

In developemnt.rb / test.rb, può essere più conciso come segue:

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

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

7

Puoi sempre passare l'host come parametro all'helper dell'URL:

listing_url(listing, host: request.host)

Nota: è possibile aggiungere anche una portalisting_url(listing, host: request.host, port: 3000)
drhenner

Ma cosa succede se non si dispone del contesto della richiesta? Come in molte altre cose oltre a un controller?
cortei


1

Ho avuto questo stesso errore. Ho scritto tutto correttamente, incluso il Listato 10.13 del 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

ovviamente con "esempio.com" sostituito con l'URL del mio server.

Ciò che avevo trattato nel tutorial era questa riga:

Dopo aver riavviato il server di sviluppo per attivare la configurazione ...

Quindi la risposta per me è stata quella di spegnere e riaccendere il server.


1

vai su config / ambienti / test.rb

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


2
La risposta richiede ulteriori informazioni. Descrivi ciò che stai effettivamente proponendo come soluzione.
Levi Roberts,

1
Ecco alcuni consigli utili su come rispondere . Li trovo utili a cui fare riferimento.
Garrett Motzner,

1

nel caso in cui qualcuno lo trovi alla ricerca di errori riguardanti ActiveStorage:

se si dispone di un'azione del controller in cui si desidera generare URL di upload, ecc. con il servizio disco locale (molto probabilmente nell'ambiente di test), è necessario include ActiveStorage::SetCurrentnel controller per consentire il blob.service_url_for_direct_uploadcorretto funzionamento.


Grazie! Usarlo al di fuori di un controller (mutazione di upload diretto GraphQL) quindi ho dovuto modificarlo un po ', ma funziona. Lo stavo cercando, grazie ancora @phoet :)
Stan

0

L'aggiunta di default_url nelle route non è la soluzione giusta, sebbene funzioni in alcuni casi.

Devi impostare default_url in ogni ambiente (sviluppo, test, produzione).

È necessario apportare queste modifiche.

    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

La risposta di cui sopra non ha funzionato per me, almeno non come volevo. Mi sono reso conto config.action_mailer.default_url_options = { host: "localhost", port: 3000 } dopo aver installato devise. Spero che possa aiutare qualcuno con lo stesso problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.