Host mancante da colbind a! Fornire: parametro host o set default_url_options

Sono stato su Google per circa 90 minuti e ancora non ho una risposta a questo. Dove imposto default_url_options ? L’ho già impostato per config.action_mailer.default_url_options per risolvere questo stesso bug altrove, ma ora sto ricevendo questo errore quando provo a utilizzare un helper URL all’interno di una specifica RSpec. Non ho idea di dove si aspetti che default_url_options sia impostato.

  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 ' 

Questo codice non ha nulla a che fare con le e-mail / ActionMailer, semplicemente ha bisogno di un URL invece di un percorso.

Qualche idea?

È 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 dall’ambiente all’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" } 
 Your::Application.routes.draw do default_url_options :host => "example.com" # ... snip ... end 

Da qualche parte in routes.rb 🙂

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

 config/environments/development.rb 

Vedi questa domanda e questa domanda .

Quando si utilizza un metodo listing_url verrà restituito l’URL completo (non uno relativo come di consueto). Ecco perché rails ti chiede l’host, per calcolare l’intero URL.

Come puoi dire ai binari 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 delle rotaie, ricorda di fare lo stesso per la tua app fittizia nei test del motore: path_to_your_engine/test/dummy/config/environments/* perché quando testi il ​​motore è su che cosa sta 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 listing_path metodo listing_path

Stranamente, l’impostazione config.action_mailer.default_url_options non mi aiuta. Inoltre, fare confusione con le impostazioni indipendenti dall’ambiente in luoghi in cui ritenevo che non appartenesse non era soddisfacente per me. Inoltre, volevo una soluzione che funzionasse durante la generazione degli URL nei lavoratori sidekiq / resque.

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

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

Imposta default_url_options per utilizzare action_mailer.default_url_options .

In ognuno dei file dell’ambiente (ad esempio development.rb , production.rb , ecc.) È ansible specificare le action_mailer default_url_options da utilizzare 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é ActionMailer questo errore in qualcosa che non è ActionMailer .

Puoi impostare le action_mailer default_url_options dell’applicazione per utilizzare ciò che hai definito per action_mailer nel file di ambiente appropriato ( development.rb , production.rb , ecc.).

Per mantenere le cose il più sicure ansible, fai questo nel tuo file config/environment.rb così devi farlo una sola 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 action_mailer.default_url_options la tua app, le action_mailer.default_url_options default_url_options dell’intera applicazione corrisponderanno alle tue 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"} 

Suggerimento per @pduersteler per avermi guidato su questo percorso.

È sempre ansible passare l’host come parametro all’helper URL:

 listing_url(listing, host: request.host) 

È ansible impostare le opzioni di URL di default nel controller dell’applicazione:

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

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

Ho avuto lo 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.

Quello che avevo sfogliato nel tutorial era questa linea:

Dopo aver riavviato il server di sviluppo per triggersre la configurazione …

Quindi la risposta per me è stato spegnere e riaccendere il server.

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

Devi impostare il 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'