2012-05-01 24 views
5

私は回復モジュールは、(アプリは招待のみである)、私は部分的に初期化のメソッドを宣言し、私の​​ユーザーのためのパスワードリセットのリンクを含む電子メールを「招待」送りたい: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 

回復可能がきれいに拡張され、それ私のメーラーがinvite_new_user法(レールのコンソール出力を)持っていないことを言う:

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 

が、呼び出しは、同じコンソールセッションでの方法があります。

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

私は何が欠けていますか?

+2

'Devise.mailer'は' Devise :: Mailer'を返します。これはクラスであり、インスタンスではありません。したがって、おそらく 'invite_new_user'を' self.invite_new_user'と定義するべきです。 – Casper

+0

ヒントありがとう、それは私に考えさせた。このメソッドはコントローラからアクセスしている間はうまくいくようですが、コンソールでモデルのみをロードすると、あなたのようにオブジェクトの代わりにクラスを返すようです。 – meta

答えて

2

工夫が必要なもののために、設定することができます。

の1-アプリ/メーラー/ auth_mailer.rbファイルにMailerクラスを作成し、それがDevise::Mailer

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

から継承させます2- config/initializers/devise.rbファイルを編集してクラスを使用するようにDeviseに指示し、追加する:

config.mailer = 'AuthMailer' 

3-(オプション)た場合(および場合のみ)あなたがそのようなSideKiqかなどの送信遅延のメールを使用DelayedJobあなたが開発に熱心な負荷に必要になることがあり、または遅延の仕事はあなたのAuthMailerクラスを見つけられないことがあります。設定/環境/ development.rb

config.eager_load = true 

、4-では、私は個人的に代わりに工夫クラスに


サイドノートをパッチ適用の私のUserクラスでごsend_invite_user_instructions!メソッドを定義します:私はないんだけど大ファンやRailsイニシャライザでクラスの宣言を行うのは、宝石のデザインによってはオートロードに問題が生じる可能性があります。イニシャライザを実行することなく、実行時にオブジェクトをリロードする宝石(Monologue)サルのパッチは、最初の呼び出しでうまく動作しますが、次の呼び出し。

関連する問題