Hôte manquant à lier! Veuillez fournir: paramètre hôte ou définir default_url_options [: hôte]

183

Je cherche sur Google depuis environ 90 minutes maintenant et je n'ai toujours pas de réponse à cela. Où dois-je installer default_url_options? Je l'ai déjà configuré pour config.action_mailer.default_url_optionsrésoudre ce même bogue ailleurs, mais maintenant j'obtiens cette erreur en essayant d'utiliser un assistant d'URL dans une spécification RSpec. Je n'ai aucune idée de l'endroit où il 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 se trouve qu'il a juste besoin d'une URL au lieu d'un chemin.

Des idées?

d11wtq
la source
Quel est l'hôte de toute façon?
Jwan622

Réponses:

260

Vous devez ajouter la ligne suivante dans chaque environnement:

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

De cette façon, il 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" }
Carlos Castillo
la source
16
Assurez-vous également de redémarrer votre serveur rails après avoir ajouté cela. Les fichiers sous config / ne sont pas rechargés automatiquement.
Stenerson le
3
J'ai fait très similaire à ceci et définir l'option default_url_option pour action_mailer n'aidera pas. Le cas d'utilisation est similaire à celui-ci: Rails.application.routes.url_helpers.message_image_url (2)
Boti
1
A fait cela; avec ou sans www ... préfixant le nom d'hôte en production, j'ai toujours la même erreur. Ajout de la route par @ d11wtq, et cela a fonctionné. Y a-t-il un changement de Rails4 qui a causé ce comportement? Je ne l'ai jamais vu avant la mise à jour, et seulement dans un envoi de courrier particulier (conception automatisée), depuis.
JosephK
Peut confirmer que cela ne fonctionne pas dans mes projets Rails 4. Le définir dans les routes n'est tout simplement pas une option.
b1nary
4
Ne fonctionne pas dans Rails 5. Ajouté default_url_options Rails.application.config.action_mailer.default_url_optionscependant et cela a fait l'affaire, comme suggéré par un autre commentateur
BooBailey
74
Your::Application.routes.draw do
  default_url_options :host => "example.com"

  # ... snip ...
end

Quelque part dans routes.rb:)

d11wtq
la source
35
Pas très bon si vous avez de nombreux environnements différents avec des URL différentes
Neil Middleton
2
Ouais, que faites-vous si vous avez plusieurs domaines d'environnement?
wejrowski
On peut supposer que vous spécifiez juste pour chaque URL au lieu, que ce soit dans la feuille de route, ou dans l'invocation d'aide url: listing_url(listing, :host => "whatever.com").
d11wtq
14
Dans le fichier de configuration de chaque environnement respectif, j'ajoute cette option personnalisée: config.domain = 'staging.myapp.com'(bien sûr, remplacez-la par un nom de domaine correct pour chaque env). Ensuite, routes.rbje suis libre d'utiliser default_url_options host: Rails.application.config.domainet cela fonctionnera dans n'importe quel environnement. De rien.
Prathan Thananart
10
Une meilleure approche serait, dans le fichier itinéraires, procédez comme suit: default_url_options Rails.application.config.action_mailer.default_url_options.
siannopollo
42

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 .

nickh
la source
4
Merci, à mon
humble avis
1
Cette réponse n'aide pas lorsque vous utilisez différents domaines et résout d'autres problèmes.
Ryan
1
@Ryan, vous pouvez simplement utiliser des variables d'environnement pour résoudre ce problème
courtsimas
35

Préparez-vous default_url_optionsà 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 l' default_url_optionsutiliser 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 votre application est default_url_optionsd'utiliser ce que vous avez défini pour action_mailerdans le fichier environnement approprié ( development.rb, production.rb, etc.).

Pour garder les choses aussi SÈCHES que possible, faites-le dans votre config/environment.rbfichier afin que vous n'ayez à le faire qu'une seule 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

Désormais, lorsque vous démarrez votre application, l'ensemble de votre application default_url_optionscorrespondra à 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"}

Pointe du chapeau à @pduersteler pour m'avoir conduit sur cette voie.

Joshua Pinter
la source
2
La configuration du config/environment.rbcomme vous l'avez décrit a été la clé pour faire fonctionner mon mailer dans la console. Je vous remercie!
Eric D.Fields
@ EricD.Fields De rien, Eric! Je trouve cela tellement utile que je pense qu'il devrait être intégré au noyau de Rails.
Joshua Pinter
Ce serait Rails.application.default_url_options = Rails.application.config.action_mailer.default_url_optionspour Rails 5.2+
Sandro L
Merci, @SandroL! Nous sommes toujours sur Rails 4.2, nous n'avons donc pas encore testé les versions ultérieures.
Joshua Pinter
Quelques personnes recommandent cela. Je suppose que c'est juste que les gens ont tendance à avoir action_mailer.default_url_options déjà configurés pour des raisons historiques, mais n'est-il pas plus logique de définir cela en fonction de application.default_url_options plutôt que l'inverse? Pourquoi impliquer une fausse référence de messagerie lors de la configuration du fonctionnement des liens de votre site Web?
Harry Wood le
24

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

Comment pouvez-vous dire aux rails l'hôte? Vous pouvez le faire de plusieurs manières:

1.Ajout de 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" }

REMARQUE: Si vous travaillez à l'intérieur d'un moteur de rails, n'oubliez pas de faire de même pour votre application factice lors des tests de moteur: path_to_your_engine/test/dummy/config/environments/*car lorsque vous testez le moteur, c'est contre quoi les rails sont testés.

Ajoutez l'option host à la méthode foo_url comme ceci:

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

3.Ne pas sortir 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 car dans ce cas j'utiliserais la listing_pathméthode

Ivanxuu
la source
L'étape 1 fonctionne toujours pour moi et aujourd'hui, en utilisant la gemme raffinerie-cms, l'étape 2 me sauve. Merci pour le commentaire.
lucianosousa
15

Chose drôle, ce réglage config.action_mailer.default_url_optionsne m'aide pas. De plus, jouer avec des paramètres indépendants de l'environnement dans des endroits où je sentais que cela n'appartenait pas n'était pas satisfaisant pour moi. De plus, je voulais une solution qui fonctionne lors de la génération d'URL dans les workers sidekiq / resque.

Mon approche jusqu'à présent, 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 les rails> = 3.2.x.

pduersteler
la source
1
Ceci et seulement cela a fonctionné pour que le mailer inclue l'URL, mais cela brise d'autres fonctions link_to dans mon application.
1
Bonne réflexion, @pduesteler! En fait, j'ai poussé cette étape plus loin et j'ai pu ajouter une seule ligne dans le config/environment.rbfichier pour ce faire. Et une réponse ajoutée qui entre dans les détails: stackoverflow.com/a/48529627/293280 Merci de m'avoir pointé dans cette direction.
Joshua Pinter
9

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

Dans le developemnt.rb / test.rb, peut être plus concis comme suit:

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

  routes.default_url_options[:host] = 'localhost:3000'
end
Fan de Derek
la source
7

Vous pouvez toujours transmettre l'hôte en tant que paramètre à l'assistant d'URL:

listing_url(listing, host: request.host)
Undistraction
la source
Remarque: vous pouvez également ajouter un portlisting_url(listing, host: request.host, port: 3000)
drhenner
Mais que faire si vous n'avez pas le contexte de la demande? Comme dans la plupart des choses autres qu'un contrôleur?
courtsimas
1

J'ai eu cette même erreur. J'ai 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 "example.com" remplacé par mon URL de serveur.

Ce que j'avais passé sous silence dans le didacticiel était cette ligne:

Après avoir redémarré le serveur de développement pour activer la configuration ...

La réponse pour moi a donc été d'éteindre et de rallumer le serveur.

Okomikeruko
la source
1

allez dans config / environnements / test.rb

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

milad rahmani
la source
2
La réponse a besoin de plus d'informations. Veuillez décrire ce que vous proposez réellement comme solution.
Levi Roberts
1
Voici quelques conseils utiles sur la façon de répondre . Je les trouve utiles pour y faire référence.
Garrett Motzner
1

juste au cas où quelqu'un trouverait cette recherche d'erreurs concernant ActiveStorage:

si vous avez une action de contrôleur où vous souhaitez générer des URL de téléchargement, etc. avec le service de disque local (très probablement dans un environnement de test), vous devez le faire include ActiveStorage::SetCurrentdans le contrôleur afin de permettre blob.service_url_for_direct_uploadde fonctionner correctement.

phoet
la source
Je vous remercie! L'utilisation de cela en dehors d'un contrôleur (mutation de téléchargement direct GraphQL) a donc dû le modifier un peu, mais fonctionne. Je cherchais ça, merci encore @phoet :)
Stan
0

L'ajout de default_url dans les routes 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 apporter ces modifications.

    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
la source
0

J'ai résolu le problème en configurant environment.rb comme

YourApp :: Application.default_url_options = VotreApp :: Application.config.action_mailer.default_url_options

Vous devez définir default_url_options pour l'action mailer par rapport à chaque environnement comme le développement, les tests, la préparation et la production, etc.

Référence: hôte manquant vers lequel établir un lien! Veuillez fournir: paramètre hôte ou définir default_url_options [: hôte]

zeeshan
la source
0

La réponse ci-dessus n'a pas fonctionné pour moi, du moins pas comme je le voulais. J'ai réalisé config.action_mailer.default_url_options = { host: "localhost", port: 3000 } après avoir installé la devise. J'espère que cela aidera quelqu'un avec le même problème.

Ahmed J.
la source