web-dev-qa-db-fra.com

Hôte manquant à lier! Veuillez fournir: Paramètre d'hôte ou définissez default_url_options [: Hôte]

Je recherche Google depuis environ 90 minutes et je n'ai toujours pas de réponse à cette question. Où est-ce que je place default_url_options? Je l'ai déjà configuré pour config.action_mailer.default_url_options afin de résoudre le même bogue ailleurs, mais maintenant, je reçois cette erreur en essayant d'utiliser un utilitaire d'URL dans une spécification RSpec. Je ne sais pas où on s'attend à ce que default_url_options soit défini.

 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)>'

Ce code n'a rien à voir avec les emails/ActionMailer, il a simplement besoin d'une URL plutôt que d'un chemin.

Des idées?

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

  # ... snip ...
end

Quelque part dans routes.rb :)

64
d11wtq

Vous devez ajouter la ligne suivante à chaque environnement:

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

De cette façon, cela peut fonctionner dans tous les environnements et peut être différent d'un environnement à l'autre. Par exemple:

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

L'hôte doit être spécifié dans le fichier de configuration de chaque environnement. Par exemple:

config/environments/development.rb

Voir cette question et cette question .

39
nickh

Configurez default_url_options pour utiliser votre action_mailer.default_url_options.

Dans chacun de vos fichiers d’environnement (par exemple, development.rb, production.rb, etc.), vous pouvez spécifier le default_url_options à utiliser pour action_mailer:

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

Cependant, ils ne sont pas définis pour MyApp:Application.default_url_options:

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

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

C'est pourquoi vous obtenez cette erreur en dehors de ActionMailer.

Vous pouvez configurer le default_url_options de votre application pour qu'il utilise ce que vous avez défini pour action_mailer dans le fichier d'environnement approprié (development.rb, production.rb, etc.).

Pour garder les choses aussi DRY que possible, faites ceci dans votre fichier config/environment.rb afin que vous n'ayez qu'à le faire une fois:

# 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

Maintenant, lorsque vous démarrez votre application, le default_url_options de l'intégralité de votre application correspond à votre 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"}

Chapeau à @ pduersteler pour m'avoir conduit dans cette voie.

27
Joshua Pinter

Lorsque vous utilisez une méthode listing_url, l'URL complète sera renvoyée (pas une adresse relative comme d'habitude). C'est pourquoi Rails vous demande l'hôte, pour calculer l'URL complète.

Comment savoir Rails l'hôte? Vous pouvez le faire de plusieurs manières:

1.Ajouter cette option à chaque environnement:

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

NOTE: Si vous travaillez dans un moteur Rails , n'oubliez pas de faire de même pour votre application factice dans les tests de moteur: path_to_your_engine/test/dummy/config/environments/* parce que lorsque vous testez le moteur, c'est ce que Rails teste.

2.Ajouter l'option Host à la méthode foo_url comme ceci:

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

.Pas de sortie de l'hôte avec l'option :only_path to true.

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

IMHO je ne vois pas le point sur celui-ci parce que dans ce cas j'utiliserais la méthode listing_path

24
ivanxuu

C'est drôle, ce réglage config.action_mailer.default_url_options ne m'aide pas. De plus, déconner avec des paramètres indépendants de l'environnement dans des endroits où je sentais que cela n'appartenait pas ne me satisfaisait pas. De plus, je voulais une solution qui fonctionne lors de la génération d’URL dans les travailleurs sidekiq/resque.

Mon approche jusqu'ici, qui va dans 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

Cela fonctionne pour moi dans Rails> = 3.2.x.

14
pduersteler

Vous pouvez toujours transmettre Host en tant que paramètre à l’assistant d’URL:

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

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

Dans le développement.tb/test.tb, peut être plus concis comme suit:

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

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

Vous pouvez définir les options d’URL par défaut dans le contrôleur d’application:

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

J'ai eu cette même erreur. J'avais tout écrit correctement, y compris le Listing 10.13 du tutoriel.

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

évidemment avec "exemple.com" remplacé par mon URL de serveur.

Ce que j'avais survolé dans le tutoriel était cette ligne:

Après redémarrage du serveur de développement pour activer la configuration ...

La solution pour moi a donc été d’éteindre et de rallumer le serveur.

1
Okomikeruko

aller à config/environnements/test.rb

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

1
milad rahmani

L'ajout de default_url dans les itinéraires n'est pas la bonne solution, bien que cela fonctionne dans certains cas.

Vous devez définir default_url dans chaque environnement (développement, test, production).

Vous devez faire ces changements.

    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