2013-02-14 4 views
1

Я определил ActionMailer Observer и не вызывается. Как я могу решить проблему? Rails 3.1.3, Ruby 1.9.2. В качестве альтернативы, я хочу, чтобы метод вызывался всякий раз, когда отправляется электронное письмо из определенного подкласса ActionMailer. Это единственный способ, который я смог найти для его реализации (я мог бы вызвать метод из каждого метода рассылки в подклассе ActionMailer, но это не очень СУХОЙ). Любые другие предложения относительно того, как добиться этого, будут приветствоваться.ActionMailer Observer не работает

config/initializers/mail_observer.rb: 
    class MailObserver 
    def self.delivered_email(message) 
     require 'ruby-debug' ; debugger 
     user = User.find_by_email(message.to[0]) 
     if user 
     email_type = caller[1] 
     UserMailerLogging.create!(user_id: @user.id, email_type: email_type, contents: self.body) 
     end 
    end 
    end 

    ActionMailer::Base.register_observer(MailObserver) 

app/mailers/user_mailer: 
    class UserMailer < ActionMailer::Base 
    default from: "[email protected]" 
    ... 
    def unfinished_setup(user) 
     @user = user 
     mail to: user_email(user), subject: "Testing..." 
    end 
    ... 
    end 

И, в консоли Rails:

irb(main):001:0> UserMailer.unfinished_setup(User.find(1))  
=> #<Mail::Message:70192154395900, Multipart: false, Headers: <From: [email protected]>, <To: Test User<[email protected]>>, <Subject: Testing...>, <Mime-Version: 1.0>, <Content-Type: text/plain>> 

ответ

2

Я считаю, что наблюдатель не будет срабатывать, пока вы на самом деле доставить сообщение. Ваш код в консоли rails только создает адрес электронной почты, а не отправляет его. Добавление .deliver в конец должно доставить сообщение и выполнить код наблюдателя.

+0

Спасибо, ты прав. Мой производственный код имел в нем доставку (вызывающий к почтовому агенту), но я не добавлял '.deliver' в тестовую команду в консоли. Это разрешило проблему. –

Смежные вопросы