2013-05-07 49 views
2

我有一個自定義郵件(UserMailer.rb)和一些方法來覆蓋歡迎電子郵件的默認設計方法和忘記密碼電子郵件。郵件程序使用自定義模板來設置電子郵件的風格 - 而且效果很好。我如何定製Devise的「重發確認電子郵件」

config/initializers,我有

module Devise::Models::Confirmable 
    # Override Devise's own method. This one is called only on user creation, not on subsequent address modifications. 

    def send_on_create_confirmation_instructions 
    UserMailer.welcome_email(self).deliver 
    end 

    ... 
end 

文件(同樣,UserMailer是建立和歡迎電子郵件的偉大工程,重置密碼的電子郵件。)

但是,什麼是不工作是選項「重新發送確認說明。」它使用默認的設計樣式發送,我希望它使用我的郵件程序佈局的樣式。我知道我可以手動將佈局添加到默認的Devise佈局,但我想保持DRY有效,而不必這樣做。

我試圖重寫send_confirmation_instructions方法found here,但我在

7 # POST /resource/confirmation 
8 def create 
9  self.resource = resource_class.send_confirmation_instructions(resource_params) 

在我的初始化文件中獲取在create(gem) devise-2.2.3/app/controllers/devise/confirmations_controller.rb一個wrong number of arguments (1 for 0)錯誤,我能夠得到這個錯誤通過添加新替代Devise,但我可能沒有正確地做到這一點:

module Devise::Models::Confirmable::ClassMethods 
    def send_confirmation_instructions 
    UserMailer.send_confirmation_instructions(self).deliver 
    end 
end 

任何想法?

回答

5

您不必通過該初始化程序來執行此操作。我通過覆蓋確認控制器來完成此操作。我對色器件的樣子路線:

devise_for :user, :path => '', :path_names => { :sign_in => 'login', :sign_out => 'logout', :sign_up => 'signup'}, 
:controllers => { 
    :sessions => "sessions", 
    :registrations => "registrations", 
    :confirmations => "confirmations" 
} 

然後,創建confirmations_controller並擴展設計:: ConfirmationsController覆蓋:

class ConfirmationsController < Devise::ConfirmationsController 

該控制器中,我有一個創建方法覆蓋默認:

def create 

    @user = User.where(:email => params[:user][:email]).first 

    if @user && @user.confirmed_at.nil? 
    UserMailer.confirmation_instructions(@user).deliver 
    flash[:notice] = "Set a notice if you want" 
    redirect_to root_url 
    else 
    # ... error messaging or actions here 
    end 

end 

顯然,在UserMailer中,您可以指定將用於顯示確認消息的html/text模板。 confirmation_token應該是@user模型的一部分,您可以使用它來創建帶有正確標記的URL:

<%= link_to 'Confirm your account', confirmation_url(@user, :confirmation_token => @user.confirmation_token) %>