2010-12-29 3 views

Antwort

16

ändern kann ich es tat durch zwingende zeugen bestätigen! methode: https://gist.github.com/982181

class User < ActiveRecord::Base 
    devise :invitable, :database_authenticatable, :registerable, :recoverable, 
     :rememberable, :confirmable, :validatable, :encryptable 

    # ... 

    # devise confirm! method overriden 
    def confirm! 
    welcome_message 
    super 
    end 

    # ... 

private 

    def welcome_message 
    UserMailer.welcome_message(self).deliver 
    end 

end 
+7

Was ist, wenn Sie nicht verwenden: bestätigbar? – Arcolye

+2

Wenn nicht: compfirmable, würde ich die gleiche Methode verwenden, aber rufen Sie es auf: after_create –

1

Schauen Sie in Ihre config/devise.rb

Sie die Themen in Ihrem lokalen Dateien (config/locales/devise.en.yml)

5

Dies ist eine großartige Diskussion. Das Überschreiben der Methode, wie es Benoror vorschlägt, wird großartig funktionieren. Wenn Sie der Meinung sind, dass Sie andere Benutzerereignisse erfassen möchten, könnte eine Observer-Klasse, wie einige andere an anderer Stelle vorgeschlagen haben, der sauberste Ansatz sein. Diese Lösung ist für Rails 3.0.x und 3.1.

Um einen Beobachter einzurichten, nehmen Sie die folgenden Änderungen an Ihrer Anwendungsdatei vor und fügen diesen Beobachter zu allen anderen hinzu, die Sie möglicherweise bereits haben.

#config/application.rb 
config.active_record.observers = :user_observer 

Dann eine neue Datei im Verzeichnis Modelle erstellen:

#app/models/user_observer.rb 
class UserObserver < ActiveRecord::Observer 
    def after_create(user) 
    Notifier.user_new(user).deliver 
    end 
end 

Wenn Sie eine Gurke Test haben, dass die Benutzer Funktionen erstellen Übungen, können Sie diesen Schritt zu diesem Feature hinzufügen und sie sichern mit ein Worker-Schritt, um nach einer E-Mail im Test-Mail-Array zu suchen.

#features/users/sign_up.feature for example 
Scenario: User signs up with valid data 
    ... 
    And I should receive an email with "[Text from your welcome message]" 


#features/common_steps.rb 
Then /^I should receive an email with "([^"]*)"$/ do |value| 
    # this will get the most recent email, so we can check the email headers and body. 
    ActionMailer::Base.deliveries.should_not be_empty 
    @email = ActionMailer::Base.deliveries.last 
    @email.body.should include(value) 
    #@email.from.should == ["[email protected]"] 
end 

Sie Umgebungen/test.rb sollten diese Einstellungen müssen eine E-Mail-Array aufzubauen statt zu senden:

config.action_mailer.delivery_method = :test 
config.action_mailer.perform_deliveries = true 

Unnötig zu sagen, dass Sie viel mehr testen können (auf, ab, usw.) in die Nachricht, aber dies wird Sie in einer BDD-Art starten, wenn Sie so geneigt sind.

Siehe auch einige ältere Stackoverflow-Threads mit Einblick in diese Frage sind:

20

ich nicht die „genehmigt“ verwenden können, Antwort, weil ich nicht bin mit Devise's: Bestätigbar.

Ich mochte die anderen Lösungen nicht, weil Sie Modell-Callbacks verwenden müssen, die immer Begrüßungs-E-Mails senden, auch wenn Sie sein Konto in der Konsole oder einer Admin-Oberfläche erstellen. Meine App beinhaltet die Möglichkeit, Benutzer aus einer CSV-Datei massenweise zu importieren. Ich möchte nicht, dass meine App eine Überraschungs-E-Mail an alle 3000 von ihnen eins nach dem anderen sendet, aber ich möchte, dass Nutzer, die ihr eigenes Konto erstellen, eine Willkommens-E-Mail erhalten. Die Lösung:

1) außer Kraft setzen Devise des Registrations-Controller:

#registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 

    def create 
    super 
    UserMailer.welcome(resource).deliver unless resource.invalid? 
    end 

end 

2) Sagen Sie Entwickeln Sie ihre Anmeldungen Controller overrode:

# routes.rb 
devise_for :users, controllers: { registrations: "registrations" } 

Natürlich können Sie "UserMailer" anpassen und " devise_for: users "mit dem von Ihnen verwendeten Modellnamen übereinstimmen.

+1

Um dies mit Devise für Nicht-Benutzer zu verwenden, müssen Sie stattdessen 'resource' verwenden:' RegistrationsMailer.welcome (resource) .deliver if resource.persisted? ' – indirect

+0

In diesem Satz wird die Mail gesendet, auch wenn die Benutzerregistrierung nicht abgeschlossen ist. –

+2

Nein, das ist in Ordnung, wie es ist. Die Option 'unless @ user.invalid?' Stellt sicher, dass sie erst gesendet wird, wenn die Registrierung abgeschlossen ist. – Arcolye