2011-09-01 50 views
3

我試圖在我的rails(3.0.10)應用程序中攔截消息來修改主體。雖然我能找到一些有關如何做到這一點的信息,但似乎有些事情已經改變,現在使用舊的方法不再有效。如何在軌道3上攔截ActionMailer的消息?

我使用看起來像這樣的代碼:

class Hook 
    def self.delivering_email(message) 
    message.subject = 'Hook changed the subject' 
    end 
end 

ActionMailer::Base.register_interceptor(Hook) 

發送電子郵件後,受試者沒有得到改變!

我還發現a tweet這表明攔截器不使用的郵件上deliver方法時調用,但premailer-rails3寶石使用我用同樣的方法,並可以正常訪問(插件特別提到它的工作原理與deliver法)!

我在這裏沒有想法,那麼是什麼原因導致我的問題?

+0

哪裏是你的'Hook'類中定義的,和你在哪裏調用從'register_interceptor'方法? –

+0

它位於'lib'目錄下的文件中。 'register_interceptor'在類定義之後被調用。我使用初始化程序加載所有庫。我也確定它是通過創建一個未定義的Class來加載的,並且足夠肯定的rails告訴了我它,所以我確定它正在加載。 – Maher4Ever

+0

您是否曾嘗試在您的'deliver_email'方法中放入記錄器語句以確保它甚至被調用? –

回答

5

這聽起來像它可能是一個操作順序的問題。

您是否考慮過在初始化程序如config/initializers/mail_hook.rb中引用整個代碼塊?

如果該premailer插件的工作原理,我能想到的唯一區別是攔截掛鉤在應用程序初始化過程中註冊。

5

看到RailsCast或AsciiCast情節#206

http://railscasts.com/episodes/206-action-mailer-in-rails-3

http://asciicasts.com/episodes/206-action-mailer-in-rails-3

有關部分從第一集,

/lib/development_mail_interceptor.rb

class DevelopmentMailInterceptor 
    def self.delivering_email(message) 
    message.subject = "[#{message.to}] #{message.subject}" 
    message.to = "[email protected]" 
    end 
end 

/config/initializers/setup_mail.rb

Mail.register_interceptor(DevelopmentMailInterceptor) if Rails.env.development?