¡Falta un host para vincular! Proporcione: parámetro de host o establezca default_url_options [: host]

183

He estado buscando en Google durante unos 90 minutos y todavía no tengo una respuesta para esto. ¿Dónde configuro default_url_options? Ya lo configuré para config.action_mailer.default_url_optionsresolver este mismo error en otro lugar, pero ahora recibo este error al intentar usar un ayudante de URL dentro de una especificación RSpec. No tengo idea de dónde espera que se establezcan 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)>'

Este código no tiene nada que ver con los correos electrónicos / ActionMailer, simplemente necesita una URL en lugar de una ruta.

¿Algunas ideas?

d11wtq
fuente
¿Cuál es el anfitrión de todos modos?
Jwan622

Respuestas:

260

Debe agregar la siguiente línea en cada entorno:

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

De esa manera, puede funcionar en todos los entornos y podría ser diferente de un entorno a otro. Por ejemplo:

desarrollo.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" }
Carlos Castillo
fuente
16
También asegúrese de reiniciar su servidor rails después de agregar esto. Los archivos en config / no se vuelven a cargar automáticamente.
Stenerson el
3
He hecho algo muy similar a esto y establecer la opción default_url_option para action_mailer no ayudará. El caso de uso es similar a este: Rails.application.routes.url_helpers.message_image_url (2)
Boti
1
Hice esto; con o sin www ... prefijando el nombre del host en producción, todavía recibí el mismo error. Se agregó la ruta por @ d11wtq, y funcionó. ¿Hay algún cambio en Rails4 que haya causado este comportamiento? Nunca lo vi antes de la actualización, y solo en un envío de correo particular (dispositivo automatizado) desde entonces.
JosephK
Puedo confirmar que esto no funciona en mis proyectos de Rails 4. Establecerlo en rutas simplemente no es una opción.
b1nario
44
No funciona en Rails 5. Sin default_url_options Rails.application.config.action_mailer.default_url_optionsembargo, se agregó y eso funcionó, como lo sugirió otro comentarista
BooBailey el
74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

En algún lugar en routes.rb:)

d11wtq
fuente
35
No es muy bueno si tiene muchos entornos diferentes con URL diferentes
Neil Middleton
2
Sí, ¿qué haces si tienes múltiples dominios env?
wejrowski
Es de suponer que acaba de especificar para cada URL en su lugar, ya sea en el mapa de ruta, o en la invocación asistente de url: listing_url(listing, :host => "whatever.com").
d11wtq
14
En el archivo de configuración para cada entorno respectivo, agrego esta opción personalizada: config.domain = 'staging.myapp.com'(por supuesto, sustituya en un nombre de dominio correcto para cada env). Luego routes.rb, soy libre de usar default_url_options host: Rails.application.config.domainy funcionará en cualquier entorno. De nada.
Prathan Thananart
10
Un mejor enfoque sería, dentro del archivo de rutas, hacer esto: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo
42

El host debe especificarse en el archivo de configuración de cada entorno. P.ej:

config/environments/development.rb

Ver esta pregunta y esta pregunta .

nickh
fuente
44
Gracias, en mi humilde opinión, esta es una mejor respuesta que la respuesta que utiliza routes.draw
joelparkerhenderson
1
Esta respuesta no ayuda cuando se usan diferentes dominios y aborda otros problemas.
Ryan
1
@Ryan, puedes usar variables de entorno para arreglar eso
courtimas
35

Establecer default_url_optionspara usar su action_mailer.default_url_options.

En cada uno de los archivos de su entorno (p development.rb. Ej . production.rb, Etc.) puede especificar el default_url_optionsuso para action_mailer:

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

Sin embargo, estos no están configurados para MyApp:Application.default_url_options:

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

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

Es por eso que está recibiendo este error de fuera de nada ActionMailer.

Usted puede configurar su aplicación es default_url_optionsusar lo que definió para action_mailerel archivo de entorno apropiado ( development.rb, production.rb, etc.).

Para mantener las cosas lo más SECAS posible, haga esto en su config/environment.rbarchivo para que solo tenga que hacer esto una vez:

# 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

Ahora, cuando inicie su aplicación, toda su aplicación default_url_optionscoincidirá con su 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"}

Felicitaciones a @pduersteler por guiarme por este camino.

Joshua Pinter
fuente
2
Configurar config/environment.rbcomo lo describió fue la clave para que mi correo funcione en la consola. ¡Gracias!
Eric D. Fields
@ EricD.Fields ¡De nada, Eric! Encuentro esto tan útil que creo que debería integrarse en el núcleo de Rails.
Joshua Pinter
Eso sería Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionspara Rails 5.2+
Sandro L
Gracias, @SandroL! Todavía estamos en Rails 4.2, así que aún no lo he probado en versiones posteriores.
Joshua Pinter
Algunas personas recomiendan esto. Supongo que es solo que las personas tienden a tener action_mailer.default_url_options ya configuradas por razones históricas, pero ¿no es más lógico establecer eso en función de application.default_url_options en lugar de al revés? ¿Por qué involucrar una referencia de correo falso al configurar cómo funcionan los enlaces de su sitio web?
Harry Wood
24

Cuando utilice cualquier listing_urlmétodo, se devolverá la URL completa (no una relativa como es normal). Es por eso que rails le está pidiendo el host, para calcular la URL completa.

¿Cómo puedes distinguir los carriles del anfitrión? Puedes hacerlo de varias maneras:

1.Agregando esta opción a cada entorno:

[/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: Si está trabajando dentro de un motor de rieles, recuerde hacer lo mismo para su aplicación ficticia dentro de las pruebas del motor: path_to_your_engine/test/dummy/config/environments/*porque cuando prueba el motor es contra lo que está probando los rieles.

2. Agregue la opción de host al método foo_url de esta manera:

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

3.No envíe el host con la opción:only_path to true .

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

En mi humilde opinión, no veo el punto en este caso porque en este caso usaría el listing_pathmétodo

ivanxuu
fuente
El paso 1 siempre funciona para mí y hoy, usando la gema refineria-cms solo el paso 2 sálvame. Gracias por el comentario.
lucianosousa
15

Cosa curiosa, esa configuración config.action_mailer.default_url_optionsno me ayuda. Además, jugar con configuraciones independientes del entorno en lugares que sentí que no pertenecían no fue satisfactorio para mí. Además, quería una solución que funcionara al generar URL en sidekiq / resque trabajadores.

Mi enfoque hasta ahora, que entra en 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

Esto funciona para mí en rieles> = 3.2.x.

pduersteler
fuente
1
Esto y solo esto funcionó para que el programa de correo incluya la URL, pero rompe otras funciones de link_to en mi aplicación.
1
Gran pensamiento, @pduesteler! De hecho, llevé este paso más allá y pude agregar solo una línea en el config/environment.rbarchivo para hacer esto. Y agregó la respuesta que entra en detalles: stackoverflow.com/a/48529627/293280 Gracias por señalarme en esta dirección.
Joshua Pinter
9

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

En el desarrollo.rb / test.rb, puede ser más conciso de la siguiente manera:

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

  routes.default_url_options[:host] = 'localhost:3000'
end
Derek Fan
fuente
7

Siempre puede pasar el host como parámetro al ayudante de URL:

listing_url(listing, host: request.host)
Distracción
fuente
Nota: También puede agregar un puertolisting_url(listing, host: request.host, port: 3000)
drhenner
¿Pero qué pasa si no tiene el contexto de solicitud? ¿Como en la mayoría de las cosas que no sean un controlador?
courtimas
3

Puede configurar las opciones de URL predeterminadas en el controlador de la aplicación:

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

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

RicRoberts
fuente
Esta es una buena solución para Rails 4, ya que le permite establecer opciones específicas para un controlador si es necesario.
Ibrahim
1

Tuve este mismo error. Tenía todo escrito correctamente, incluido el Listado 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

obviamente con "example.com" reemplazado con la url de mi servidor.

Lo que había pasado por alto en el tutorial fue esta línea:

Después de reiniciar el servidor de desarrollo para activar la configuración ...

Entonces la respuesta para mí fue apagar y volver a encender el servidor.

Okomikeruko
fuente
1

vaya a config / entornos / test.rb

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

milad rahmani
fuente
2
La respuesta necesita más información. Describa qué es lo que realmente propone como solución.
Levi Roberts
1
Aquí hay algunos consejos útiles sobre cómo responder . Me parece útil hacer referencia a ellos.
Garrett Motzner
1

por si alguien encuentra esto buscando errores relacionados con ActiveStorage:

Si tiene una acción de controlador donde desea generar URL de carga, etc. con el servicio de disco local (muy probablemente en un entorno de prueba), debe hacerlo include ActiveStorage::SetCurrenten el controlador para permitir blob.service_url_for_direct_uploadque funcione correctamente.

phoet
fuente
¡Gracias! Usar esto fuera de un controlador (mutación de carga directa GraphQL) tuvo que modificarlo un poco, pero funciona. He estado buscando esto, gracias de nuevo @phoet :)
Stan
0

Agregar el default_url en las rutas no es la solución correcta, aunque funciona para algunos casos.

Debe establecer default_url en cada entorno (desarrollo, prueba, producción).

Necesitas hacer estos cambios.

    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
fuente
0

La respuesta anterior no funcionó para mí, al menos no como quería. Me di cuenta config.action_mailer.default_url_options = { host: "localhost", port: 3000 } después de instalar el dispositivo. Espero que ayude a alguien con el mismo problema.

Ahmed J.
fuente