2012-05-01 17 views
5

Chcę moduł Odzyskiwalna wysłać „zaprosić” maile z linkami resetowania hasła dla moich użytkowników (aplikacja jest tylko na zaproszenie), I częściowo zadeklarować metody w inicjalizatorze:Jak prawidłowo rozszerzyć Devise Recoverable?

module Devise 
    class Mailer 
    def invite_new_user(record) 
     devise_mail(record, :invitation_instructions) 
    end 
    end 
end 

module Devise 
    module Models 
    module Recoverable 
     def send_invite_user_instructions! 
     return unless status == User::STATUS_PENDING 
     generate_reset_password_token! 
     ::Devise.mailer.invite_new_user(self).deliver 
     end 
    end 
    end 
end 

I odzyskiwalna jest przedłużony ładnie, ale to mówi, że mój program pocztowy nie ma sposobu invite_new_user (szyny wyjściowej konsola):

1.9.2p290 :002 > user.send_invite_user_instructions! 
    User Load (1.4ms) SELECT "users".* FROM "users" WHERE "users"."reset_password_token" = 'zMQK1CEXYupjNKpH8dph' LIMIT 1 
    (0.3ms) BEGIN 
    (15.0ms) UPDATE "users" SET "reset_password_token" = 'zMQK1CEXYupjNKpH8dph', "updated_at" = '2012-05-01 17:40:32.085256' WHERE "users"."id" = 59 
    (4.5ms) COMMIT 
NoMethodError: undefined method `invite_new_user' for Devise::Mailer:Class 

ale wywołujący ma metody w tej samej sesji konsoli:

1.9.2p290 :003 > ::Devise.mailer.method_defined? 'invite_new_user' 
=> true 

Czego mi brakuje?

+2

Wydaje się, że 'Devise.mailer' zwraca' Devise :: Mailer', która jest klasą, a nie instancją. Dlatego powinieneś prawdopodobnie zdefiniować 'invite_new_user' jako' self.invite_new_user'. – Casper

+0

Dzięki za podpowiedź, która sprawiła, że ​​pomyślałem. Wydaje się, że ta metoda działa dobrze podczas uzyskiwania dostępu z kontrolerów, ale podczas ładowania tylko modelu w konsoli - wydaje się zwracać klasę zamiast obiektu, jak powiedziałeś. – meta

Odpowiedz

2

Devise można ustawić się na to, czego potrzebujesz:

1- Tworzenie Mailer klasę w APP mailerach/pliku/auth_mailer.rb i sprawiają, że dziedziczą Devise::Mailer

class AuthMailer < Devise::Mailer 
    def invite_new_user(record) 
    devise_mail(record, :invitation_instructions) 
    end 
end 

2- Poinstruuj Naucz się korzystać z klasy, edytując plik config/initializers/devise.rb i dodając

config.mailer = 'AuthMailer' 

3- (opcjonalnie) Jeśli (i tylko wtedy) użyć email opóźnienia wysyłania takich jak SideKiq lub DelayedJob może trzeba chętny obciążenia w rozwoju lub opóźnione zadanie nie może odnaleźć swoją klasę AuthMailer. W config/środowiskach/development.rb

config.eager_load = true 

4- Osobiście określić metodę send_invite_user_instructions! w moim User klasy zamiast łatania Opracować klasa


marginesie: ja nie jestem wielki fan lub częściowa deklaracja klasy w inicjatorze Rails, ponieważ w zależności od tego, jak projektuje się gem, możesz mieć problemy z automatycznym ładowaniem: istnieje klejnot (Monologue), który ładuje obiekty w czasie wykonywania, bez uruchamiania inicjalizatorów, więc łatka małpa działa dobrze podczas pierwszego połączenia, ale nie na następne połączenia.

Powiązane problemy