2012-05-01 19 views
5

Ben kurtarılabilir modül benim kullanıcıları için şifre sıfırlama bağlantıları ile e-postalar (yalnızca uygulama davet üzerindedir), ben kısmen in başlatıcısı yöntemleri bildirmek "davet" göndermek istiyorum:,Devise Kurtarımı nasıl doğru şekilde genişletilir?

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 

Ve kazanılabilir güzel uzatılır ama

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 

ancak çağıran aynı konsol oturumunda yöntemi vardır:

1.9.2p290 :003 > ::Devise.mailer.method_defined? 'invite_new_user' 
=> true 
benim mailler invite_new_user yöntemi (raylar konsol çıkış) sahip olmadığını söyler

Neyi özlüyorum?

+2

Seems 'Devise.mailer', bir örnek olan' Devise :: Mailer' i döndürür. Bu nedenle muhtemelen 'invite_new_user' öğesini 'self.invite_new_user' olarak tanımlamalısınız. – Casper

+0

İpucu için teşekkürler, bu beni düşündürdü. Görünüşe göre bu yöntem kontrolörlerden erişirken iyi çalışıyor, ancak konsolda sadece model yüklerken - dediğiniz gibi nesne yerine sınıf döndürüyor gibi görünüyor. – meta

cevap

2

Devise can gerekenler için set-up be:

1- app/postaları/auth_mailer.rb dosyasında bir Mailer sınıf oluşturun ve onu miras yapmak Devise::Mailer

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

dan 2- Sınıfınızı, config/initializers/devise.rb dosyasını düzenleyerek ve

config.mailer = 'AuthMailer' 
ekleyerek sınıfınızı kullanmak için kullanın

3- (opsiyonel)ise (ve ancak) Böyle SideKiq ya da gönderen bir gecikme e-posta kullanmak DelayedJob Yapım aşamasında olan istekli yük gerekebilir, veya gecikmiş iş sizin AuthMailer sınıf bulamayabilir. config/ortamlarda/development.rb olarak

config.eager_load = true 

4- Ben şahsen yerine sınıf


Yan notu Vasiyetle yama benim User sınıfta send_invite_user_instructions! yöntemini tanımlamak olacaktır: Ben bir değilim büyük bir fan ya da Rails başlatıcısında bir sınıfın kısmi bir beyanını yapıyor, çünkü gemin nasıl tasarlandığına bağlı olarak, otomatik yükle ilgili sorun yaşayabilirsiniz: Başlangıç ​​zamanlayıcıları çalıştırmadan, başlatma zamanı sırasında nesneleri yeniden yükleyen bir mücevher (Monolog) var. maymun yama ilk aramada iyi çalışır, ancak sonraki aramalar.

İlgili konular