2017-12-13 6 views
1

新しいメーラーメソッドをDeviseに追加したいのは、組み込みのもののワークフローをコピーするだけですが、パラメータと追加のビューを追加する必要があります。たとえば、reset_password_instructionsについてはRailsカスタムメーラーを作成する

は2例で使用されます。既存のユーザーは単に自分のパスワードをリセットしたい

  1. ユーザーが別のユーザーを招待すると、そのユーザーはランダム化されたパスワードでデータベースに保存されます。彼はreset_password_tokenで電子メールを送信し、後でログインできるように彼をパスワード編集ページにリダイレクトする必要があります。

同じ機能ですが、別のビューにする必要があります招待状を送った人の名前で渡すことができます。

Deviseメーラが他のメソッドやヘルパーを呼び出すので、これを達成するために書き換えるメソッドがわからないので、非常に混乱します。

答えて

2

このように、Devise::Mailerを拡張するクラスを作成し、カスタムメールプログラムを使用するには:次に

class MyMailer < Devise::Mailer 
    helper :application # gives access to all helpers defined within `application_helper`. 
    include Devise::Controllers::UrlHelpers # Optional. eg. `confirmation_url` 
    default template_path: 'devise/mailer' # to make sure that your mailer uses the devise views 
end 

は、あなたのconfig/initializers/devise.rbで、"MyMailer"config.mailerを設定します。

他のメーラーと同じ方法でMyMailerを使用できるようになりました。余分なヘッダーを追加するために特定のメールをオーバーライドする場合は、メソッドをオーバーライドしてカスタムメソッドの最後にsuperを呼び出して、Deviseのデフォルト動作をトリガーします。次のように

は例えば、我々はconfirmation_instructions電子メールのための新しいヘッダを追加することができます。

def confirmation_instructions(record, token, opts={}) 
    headers["Custom-header"] = "Bar" 
    super 
end 
また、手動でオプションを設定することで(、REPLY_TOなどからの)基本的なヘッダのいずれかをオーバーライドすることができます

ハッシュ:(Userはあなたの工夫のモデル名である場合)、プレビューを得るために

def confirmation_instructions(record, token, opts={}) 
    headers["Custom-header"] = "Bar" 
    opts[:from] = '[email protected]' 
    opts[:reply_to] = '[email protected]' 
    super 
end 

# test/mailers/previews/my_mailer_preview.rb 
# Preview all emails at http://localhost:3000/rails/mailers/my_mailer 

class MyMailerPreview < ActionMailer::Preview 

    def confirmation_instructions 
    MyMailer.confirmation_instructions(User.first, "faketoken", {}) 
    end 

    def reset_password_instructions 
    MyMailer.reset_password_instructions(User.first, "faketoken", {}) 
    end 

    def unlock_instructions 
    MyMailer.unlock_instructions(User.first, "faketoken", {}) 
    end 
end 
メーラーが新しいメールを並ぶキュー名に制御するために

、(上記、MyMailer)あなたのクラスに次のメソッドを追加します。

def deliver_later 
    Devise::Mailer.delay(queue: 'my_queue').send(...) 
end 
関連する問題