2015-02-13 15 views
5

Ich habe ein Problem mit dem Ändern der ActionMailer :: Base.default_url_options = {: Host => Host} zur Laufzeit in einem meiner Projekte.Sidekiq + Devise Mailer mit mehreren Subdomains

Setup: Ich habe mehrere Subdomains, die dieselbe Rails-Applikation im Backend verwenden. Ich möchte meine Devise-Mails über eine Sidekiq-Warteschlange an die Benutzer senden. Die Devise-Mails (Bestätigung, Reset-Passwort) enthalten Links und diese Links benötigen die jeweilige Subdomain als korrekt.

Meine Umgebung

rails (4.2.0) 
sidekiq (3.3.1) 
devise (3.4.1) 
devise-async (0.9.0) 

ich before_action in meinem application_controller

class ApplicationController < ActionController::Base 

    before_action :set_action_mailer_default_url_options 

    private 

    def set_action_mailer_default_url_options 
    host = "my-logic-to-get-the-correct-host" 
    ActionMailer::Base.default_url_options = {:host => host} 
    end 

end 

Nun, wenn ich mein Passwort zurücksetzen wollen erhalte ich immer die Standard-URL-Optionen, die ich in den Umgebungen festgelegt haben Datei. Wenn ich die default_url_options aus meinen Umgebungen entferne, erhalte ich den Default Devise Fehler in meinen Sidekiq Logs.

ActionView::Template::Error: Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true 

Der Host wird immer korrekt in der Steuerung gesetzt. Das habe ich bereits getestet. Es scheint, dass der Host nicht an sidekiq übergeben wird .. eine Idee, wie ich das beheben kann?

Ich kann die Subdomain irgendwo nicht speichern, weil ein Benutzer die E-Mails von verschiedenen Subdomains auslösen kann und nicht immer die gleichen. Ich brauche eine Möglichkeit, Devise mitzuteilen, welcher Host zum Senden einer bestimmten E-Mail verwendet werden soll. Kann ich den Devise-Mailer überschreiben und den Host oder etwas ähnliches weitergeben?

Lösung Nach ist nicht möglich, in meinem Fall: Dynamic domain name in Rails action mailer while using sidekiq

Btw: der komplette Workflow mit devise, ersinnen-Asynchron und sidekiq selbst arbeitet (in der Entwicklung, Bereitstellung und Produktion). Nur der Host der Links ist nicht korrekt -> und das ist mein großes Problem :-) ..

+0

Hallo, haben Sie irgendeine Lösung gefunden? –

+0

@codingaddicted - Ich habe meine Antwort unten hinzugefügt. – Mattherick

Antwort

1

ich in folgende Lösung endete. Diese Lösung enthält den Fall, dass Sie mehrere Kunden haben und diese Kunden eigene E-Mail-Einstellungen und eigene Domains/Subdomains für die URLs in den Mails haben können.

ich eine eigene Mailer-Klasse verwendet und in möglichst individuelle E-Mail-Einstellungen eines Kunden angeschlossen:

config/initializers/devise.rb:

config.mailer = "DeviseMailer" 

config/secrets.yml:

app/mailers/devise_mailer.rb:

class DeviseMailer < Devise::Mailer 
    layout 'mailer' 

    after_action :set_email_settings_and_sender, only: [:reset_password_instructions, :confirmation_instructions] 

    def reset_password_instructions(record, token, opts={}) 
    @account = record.current_account if record.class == User # set the account of current_user - current_account is an own helper method 
    super 
    end 

    def confirmation_instructions(record, token, opts={}) 
    @account = record.current_account if record.class == User && record.unconfirmed_email.present? 
    super 
    end 

    private 

    # re-set the email settings for the given user and his account: 
    def set_email_settings_and_sender 
     if @account.present? && @account.custom_email_settings? 
     mail.reply_to = nil 
     settings = Rails.application.secrets.mailer_settings["customers"][@account.identifier_name]["send"].symbolize_keys 
     mail.delivery_method.settings.merge!(settings) 
     mail.from = "#{@account.display_name} <#{settings[:email]}>" 
     end 
    end 

end 

Ändern Sie die URLs in der E-Mail-Ansicht-Vorlagen:

app/views/ersinnen/Mailer/confirmation_instructions.html.erb

Einfacher Wechsel der Link mit der neuen URL-Optionen.

.

app/views/ersinnen/reset_password_instructions.html.erb

Das war meine Lösung .. Wenn Sie Fragen haben, lassen Sie es mich wissen.

EDIT: Vergessen Sie nicht, Standard-URL-Optionen in Ihrer Umgebung einzustellen. Zum Beispiel in Ihrem development.rb - config/environments/development.rb:

config.action_mailer.default_url_options = { host: "your-host.dev", port: 3000 } 
+0

Danke für das Hinzufügen Ihrer Lösung –