Comment envoyer des URL dans des emails spécifiques à l'environnement?
-
20-08-2019 - |
Question
En utilisant le code généré par restful_authentication, nous obtenons généralement "localhost" en tant qu'URL dans les courriers d'inscription et d'activation. J'essaie de créer quelque chose comme ceci à la place:
def signup_notification(user, host)
setup_email(user)
@subject += 'Please activate your new account'
@body[:url] = "http://#{host}/activate/#{user.activation_code}"
end
Cependant, puisque l'appel à livrer le courrier est dans un observateur, je ne peux pas le faire:
UserMailer.deliver_signup_notification(user, request.host_with_port)
Puisque la méthode de requête n'est pas disponible dans les modèles. Quelle est la meilleure façon de s'y prendre?
J'ai envisagé de stocker les URL par domaine dans un fichier YAML, puis de le charger au démarrage, mais les ports pourraient alors changer, de sorte que cela ne fonctionnerait pas.
Sinon, j'ai envisagé de créer une variable de classe statique quelque part, qui est définie lors du chargement de l'application, mais je ne sais pas comment s'y prendre. La méthode de requête est-elle disponible pour les initialiseurs?
La solution
essayez le plugin current_request, décrit à l'adresse http://codeshooter.wordpress.com/2009/08/
a travaillé pour moi
Autres conseils
À l’aide d’ActiveMailer, j’ai défini cela dans le config/envrionments/production.rb
config.action_mailer.default_url_options = { :host => "my.host.com" }
Dans le modèle app/models/event_mailer.rb
def new_event(event)
recipients EventMailer::NO_REPLY
bcc event.emails('new_event')
from EventMailer::FROM_EMAIL
subject "#{EventMailer::SUBJECT_HEADER} Event Updated :: #{event.title}"
content_type "text/plain"
body :event => event
end
Et ensuite dans la vue du courrier app/views/event_mailer/new_event.rb
You can view the event by going to: <%= url_for(:controller => "events", :action => "show", :id => @event.id, :only_path => false) %>
Qui génère dans le courrier:
You can view the event by going to: http://my.host.com/events/11
J'ai le même problème aussi et voici ce que j'ai fait
-
dans le modèle utilisateur, j'ajoute: hôte pour attr_accessible, puis j'ajoute cette méthode
def host=(value) write_attribute :host, value end
-
dans le contrôleur utilisateur, dans les méthodes qui envoient un courrier électronique comme créer et activer, je mets
@user.host = request.host_with_port
étant donné que je suis toujours un noob-on-rails, j'espère vraiment que quelqu'un trouvera une solution de meilleure pratique pour résoudre ce problème.
Le nom d'hôte de votre serveur est indiqué dans l'en-tête Host de la requête. Vous ne devriez pas y avoir accès dans les modèles (en supposant que les rails soient sains). Mais si vous pouvez accéder aux objets de requête dans les contrôleurs, vous pouvez insérer cette valeur dans votre champ de modèle lorsque vous extrayez les objets de modèle de la base de données.