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?
Your::Application.routes.draw do
default_url_options :Host => "example.com"
# ... snip ...
end
Quelque part dans routes.rb
:)
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" }
_
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 .
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.
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
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.
Vous pouvez toujours transmettre Host en tant que paramètre à l’assistant d’URL:
listing_url(listing, Host: request.Host)
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
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
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.
aller à config/environnements/test.rb
Rails.application.routes.default_url_options [: Host] = 'localhost: 3000'
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'