2010-12-29 19 views

risposta

16

ho fatto ridefinendo conferma del dispositivo! Metodo: 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

Cosa succede se non stai utilizzando: confermabile? – Arcolye

+2

Se non lo è: comfirmable, utilizzerei lo stesso metodo, ma lo chiamo: after_create –

1

Guardate nel vostro config/devise.rb

È possibile modificare i temi nei vostri file di localizzazione (config/locales/devise.en.yml)

5

Questa è una grande discussione. Ignorare il metodo come benoror suggerisce funzionerà alla grande. Se pensi di voler catturare altri eventi utente, allora come altri hanno suggerito altrove, una classe Observer potrebbe essere l'approccio più pulito. Questa soluzione è per Rails 3.0.xe 3.1.

Per impostare un osservatore, si apportano le seguenti modifiche al file dell'applicazione, aggiungendo questo osservatore a qualsiasi altro già esistente.

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

quindi creare un nuovo file nella directory modelli:

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

Se si dispone di un test di cetriolo che esercita le funzioni all'utente di creare, è possibile aggiungere questo passaggio per quella caratteristica e copia di backup con una fase di lavoro per verificare la presenza di un'e-mail nell'array di test mail.

#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 

Voi ambienti/test.rb dovrebbe avere queste impostazioni per creare un array di posta invece di inviare:

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

Inutile dire che è possibile testare per molto di più (a, da, ecc) in il messaggio, ma questo ti farà iniziare in modo BDD se sei così propenso.

Vedi anche alcuni thread StackOverflow più anziani con comprensione questa domanda sono:

20

non posso usare il "approvato" risposta perché non sto usando Devise's: confirmable.

Non mi piacciono le altre soluzioni perché è necessario utilizzare i callback modello, che invieranno sempre e-mail di benvenuto anche quando si crea il proprio account nella console o in un'interfaccia di amministrazione. La mia app implica la possibilità di importare in massa gli utenti da un file CSV. Non voglio che la mia app invii un'email a sorpresa a tutti e 3000 uno per uno, ma voglio che gli utenti che creano il proprio account ricevano un'e-mail di benvenuto. La soluzione:

1) Override controllore iscrizioni di Devise:

#registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 

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

end 

2) Raccontaci ideare si escludeva il suo controllore iscrizioni:

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

Naturalmente, è possibile adattare "UserMailer" e " devise_for: users "per abbinare il nome del modello che stai usando.

+1

Per far funzionare questa funzione con Devise per i non utenti, è necessario utilizzare 'resource' invece:' RegistrationsMailer.welcome (resource) .deliver if resource.persisted? ' – indirect

+0

In questa frase, la posta viene inviata anche se la registrazione dell'utente non è completa. –

+2

Non va bene così com'è. L'opzione 'unless @ user.invalid? 'Si assicura che non venga inviata a meno che la registrazione non sia completata. – Arcolye

Problemi correlati