ruby-on-rails - run - rspec rails
¡Falta el host al que enlazar! Proporcione: parámetro de host o configure default_url_options (10)
He estado buscando en Google durante aproximadamente 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_options
para resolver este mismo error en otro lugar, pero ahora recibo este error cuando trato de usar un URL helper dentro de una especificación RSpec. No tengo idea de dónde espera establecer 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?
Establezca default_url_options
para usar su action_mailer.default_url_options
.
En cada uno de los archivos de su entorno (p. Ej., action_mailer
, production.rb
, etc.), puede especificar la action_mailer
default_url_options
para usar en 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á obteniendo ese error en cualquier cosa fuera de ActionMailer
.
Puede establecer las action_mailer
su Aplicación para usar lo que definió para action_mailer
en el archivo de entorno apropiado ( development.rb
, production.rb
, etc.).
Para mantener las cosas lo más SECAS posible, haz esto en tu archivo config/environment.rb
para que solo tengas 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, todas las action_mailer.default_url_options
su action_mailer.default_url_options
coincidirán 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"}
Sombrero de punta a @pduersteler por guiarme por este camino.
¡Parece que estoy respondiendo todas mis preguntas hoy!
Your::Application.routes.draw do
default_url_options :host => "example.com"
# ... snip ...
end
En algún lugar en routes.rb :)
Agregar el default_url en las rutas no es la solución correcta, aunque funciona en algunos casos.
Debe establecer la 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''
Cuando use cualquier método listing_url
se listing_url
la URL completa (no una relativa como es normal). Es por eso que Rails te está pidiendo el host, para calcular toda la URL.
¿Cómo puedes decirle a Rails el anfitrión? Puedes hacerlo de varias maneras:
1. Añadir 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 con 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 qué rieles está probando.
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''
:only_path to true
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 método listing_path
El host debe especificarse en el archivo de configuración de cada entorno. Por ejemplo: config/environments/development.rb .
Vea esta pregunta y esta pregunta .
Es curioso que esa configuración config.action_mailer.default_url_options
no config.action_mailer.default_url_options
para nada. Además, jugar con entornos independientes del entorno en lugares donde sentía que no pertenecía no era satisfactorio para mí. Además, quería una solución que funcionara al generar URL en los trabajadores de sidekiq / resque.
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.
Necesita agregar la siguiente línea en cada entorno:
config.action_mailer.default_url_options = { :host => "yourhost" }
De esta forma, puede funcionar en todos los entornos y puede 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" }
Puede establecer las opciones de url predeterminadas en el Controlador de aplicaciones:
class ApplicationController < ActionController::Base
def default_url_options
{:locale => I18n.locale}
end
end
http://guides.rubyonrails.org/action_controller_overview.html#default_url_options
Siempre puede pasar el host como parámetro al URL helper:
listing_url(listing, host: request.host)
Tuve el 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 era esta línea:
Después de reiniciar el servidor de desarrollo para activar la configuración ...
Entonces la respuesta para mí fue apagar el servidor y volver a encenderlo.