2013-07-05 11 views
27

Ich bin ziemlich neu in Schienen und versuchen, die Dinge herauszufinden. Ich habe vor kurzem einen Mailer alle Setup und es hat gut funktioniert. Aber ich versuche, einen zweiten Mailer für Benutzeraktionen hinzuzufügen, und es scheint nicht zu funktionieren.Rails - Devise send Benutzer E-Mail nach sign_up/create

Was ich versuche zu erreichen ist, dass ein Benutzer sich anmeldet, sendet es eine E-Mail an den Administrator, dann muss der Administrator den Benutzer aktivieren. Derzeit, wenn der Administrator den Benutzer aktiviert, sendet er ihnen eine E-Mail, aber aus irgendeinem Grund wird meine neu erstellte Benutzer-E-Mail nicht ausgelöst. Ich denke, das liegt daran, dass meine Erstellungsmethode nicht ausgelöst wird, wo soll ich sie hinstellen? Muss ich eine Benutzermethode überschreiben?

Mein UserMailer Controller:

class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 
    def send_enabled_message(user) 
    @user = user 
    mail(:to => user.email, :subject => "Welcome to Pixel Technologies!!!") 
    end 
    def send_new_user_message(user) 
    @user = user 
    mail(:to => '[email protected]', :subject => "New User created please review and enable.") 
    end 
end 

Mein users_controller:

class UsersController < ApplicationController 
    before_filter :authenticate_user! 
    load_and_authorize_resource 

# POST /users 
def create 
    @user = User.new(user_params) 
    puts "******************** NEW USER ****************************" 
    puts user_params 
    if @user.save 
    puts 'Sending email for create user' 
    UserMailer.send_new_user_message(@user).deliver 
    redirect_to @user, notice: 'User was successfully created.' 
    else 
    render action: 'new' 
    end 
end 

Aber diese Methode erstellen nie gefeuert wird. Was mache ich falsch? Gibt es eine andere Methode, die ich UserMailer.send_new_user_message (@user) .deliver setzen muss?

+0

Wenn der Benutzer meldet sich der Benutzer an diesem Punkt erstellt? Wenn ja, dann vielleicht Ihre E-Mail sollte auf der Benutzer-Update-Methode gesendet werden, wenn der Admin irgendwie den Benutzer aktiviert, schwer zu sehen, ohne den ganzen Fluss ... – tronmcp

Antwort

37

Wenn Benutzer sich mit Devise anmelden, gehen sie nicht durch UsersController.

Sie können den E-Mail-Sendecode im Modell User hinzufügen.

Zum Beispiel in app/models/user.rb:

class User < ActiveRecord::Base 
    # ... 

    after_create :send_admin_mail 
    def send_admin_mail 
    UserMailer.send_new_user_message(self).deliver 
    end 

    # ... 
end 

Dies erfolgt durch die Active Record after_create Rückruf nutzen.

+1

Dieser Rückruf Weg ist meiner Meinung nach besser. +1 – sergserg

+0

Ausgezeichnet. Schnell und dreckig. Funktioniert super. – nulltek

+0

Wenn dies fehlschlägt, wird die Transaktion zurückgesetzt und das Objekt wird nicht in der Datenbank gespeichert. Wie wäre es mit after_commit anstatt after_create? –

53

Bestätigungs-E-Mails sollten vom Controller gesendet werden. Es ist einfach, die Standardwerte zu überschreiben.

die Datei erstellen app/controllers/my_registrations_controller.rb (nennen dies, was Sie wollen)

class MyRegistrationsController < Devise::RegistrationsController 

    def create 
    super 
    if @user.persisted? 
     UserMailer.new_registration(@user).deliver 
    end 
    end 

end 

Dann in Ihre Routen:

devise_for :users, :controllers => { :registrations => "my_registrations" } 
+3

Sie sollten 'if @ user.errors.empty?' Hinzufügen, sonst werden Sie E-Mails senden, auch wenn die Registrierung nicht erfolgreich war –

+0

@Alex Siri Gute Idee – Dex

+2

@AlexSiri @Dex IMO könnte es eine bessere Idee sein, '@ zu verwenden user.persisted? ', um zu verifizieren, dass der Benutzer tatsächlich in der Datenbank festgehalten wurde - fast sicher wird das Verhalten dasselbe sein, aber es ist sicherer und ich denke, die Absicht ist klarer. – Filipe

Verwandte Themen