2010-11-10 13 views
23

Używam Devise na Railsach i zastanawiam się, czy istnieje hook lub filtr, za pomocą którego mogę dodać trochę kodu do procesu rejestracji użytkownika Devise i wysłać wiadomość powitalną do użytkownika po utworzeniu konta . Bez Devise'a to by było coś takiego ...Jak wysłać wiadomość powitalną do nowo zarejestrowanych użytkowników w Railsach za pomocą Devise?

respond_to do |format| 
     if @user.save 
     Notifier.welcome_email(@user).deliver # <======= 
    ... 
+0

Czy używasz potwierdzalnej metody Devise? – Shreyas

+0

Zabawne, powinieneś zapytać, ponieważ mam problem z tą metodą. Nie wysyła e-maila, mimo że działa moja konfiguracja. Nie, na wiadomość powitalną używam własnej metody. – picardo

Odpowiedz

8

Rozwiązałem to, używając metody wywołania zwrotnego. To nie jest najczystsze z rozwiązań, nie tak czyste jak obserwator, ale ja go wezmę. Mam szczęście, że Mongoid zaimplementował callbacki ActiveRecord!

after_create :send_welcome_mail 
    def send_welcome_mail 
    Contact.welcome_email(self.email, self.name).deliver 
    end 
+0

Jak wysłać wiadomość powitalną "po" potwierdzeniu konta? (w restful_authentication była metoda o nazwie recently_activated?). –

+0

Istnieje podobna metoda w Devise. http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/Confirmable#confirmed%3F-instance_method – picardo

+2

picardo: Właściwie to tylko sprawdź, czy jest potwierdzone czy nie. Musiałem faktycznie nadpisać potwierdzenie! method: https://github.com/plataformatec/devise/issues/812#comment_1113176 –

6

Polecam używanie ActiveRecord::Observer. Pomysł z obserwatorem polega na tym, że utworzysz klasę z metodą after_save, która wywoła powiadomienie. Wszystko, co musisz zrobić, to stworzyć klasę obserwatora, a następnie zmodyfikować konfigurację aplikacji, aby zarejestrować obserwatora. Dokumentacja dość dobrze opisuje proces.

Używanie wzorca obserwatora oznacza, że ​​nie trzeba zmieniać żadnej logiki w kontrolerze.

+0

Używam Mongoida. Czy nadal można korzystać z obserwatora ActiveRecord? – picardo

+0

Dobrze patrząc na http: //blog.eizesus.com/2010/03/tworzenie-rails-authentication-system-on-mongoid-part-2-7-3-2010/nie wydaje się, że istnieje wsparcie dla obserwatora. Wydaje mi się, że twoja komunikacja after_create wydaje mi się najlepsza. –

10

https://stackoverflow.com/a/6133991/109618 pokazuje przyzwoite (nie doskonałe) odpowiedź, ale przynajmniej lepiej niż te, które widzę tutaj. To przesłania metodę confirm!:

class User < ActiveRecord::Base 
    devise # ... 
    # ... 
    def confirm! 
    welcome_message # define this method as needed 
    super 
    end 
    # ... 
end 

To jest lepsze, ponieważ nie używać wywołania zwrotne. Połączenia zwrotne nie są zbyt duże, o ile (1) sprawiają, że modele są trudne do przetestowania; (2) umieścić zbyt wiele logiki w modelach. Nadużywanie ich często oznacza zachowanie w modelu, który należy gdzie indziej. Aby uzyskać więcej informacji na ten temat, zobacz: Pros and cons of using callbacks for domain logic in Rails.

Powyższe podejście wiąże się z metodą confirm!, która jest preferowana do wywołania zwrotnego dla tego przykładu. Podobnie jak w przypadku wywołania zwrotnego, logika nadal znajduje się w modelu. :(Więc nie znajdę podejście w pełni zadowalającego

+0

Nie wiem, jak to może być lepsze, ponieważ program pocztowy jest częścią kontrolera, a nie modelu. Prostsze, ale błędne. –

33

Kolejna odpowiedź najpopularniejszym zakłada używasz korzystając opracować za:.. POTWIERDZALNE moduł, który nie jestem

mi się nie podoba druga rozwiązania, ponieważ musisz używać zwrotów modeli, które zawsze będą wysyłać e-maile powitalne, nawet gdy utworzysz swoje konto w konsoli lub interfejsie administratora Moja aplikacja obejmuje możliwość masowego importowania użytkowników z pliku CSV. aplikacja wysyłająca e-mail z niespodzianką do wszystkich 3000 z nich jeden po drugim, ale chcę, aby użytkownicy, którzy tworzą własne konto, otrzymywali powitalny adres e-mail Rozwiązanie:

1) Zastąp rejestrację produktu Devise Rolka:

#registrations_controller.rb 
class RegistrationsController < Devise::RegistrationsController 

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

end 

2) Powiedz Opracować cię overrode swój kontroler Zgłoszenia:

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

Podoba mi się to podejście, jest czyste, nie wymaga dużo kodu, a logika tego jest oczywista. Dzięki za tę odpowiedź! – asfallows

+1

Ten wydaje się być najlepszym rozwiązaniem. –

+0

Skąd wiesz, że '@ user' jest dostępny? –

2

Ponieważ yield został dodany do metod kontrolera opracować jakiś czas temu, myślę, że teraz jest to chyba najlepszy sposób aby to zrobić.

class RegistrationsController < Devise::RegistrationsController 

    def create 
    super do |resource| 
     Notifier.welcome_email(resource).deliver if resource.persisted? 
    end 
    end 

end 
Powiązane problemy