2012-01-19 50 views
5

我有要求覆蓋ActionMailer的mail方法。這種方法被保護,因此在子類中,我還定義了mail方法保護:試圖避免在電子郵件地址以「.old」結尾時發送電子郵件

protected 

def mail(headers={}, &block) 
    #add a check to avoid sending emails that end with ".old" 
    unless headers[:to] =~ /\.old$/ 
    super(headers, &block) 
    end 
end 

這樣,當外發的電子郵件地址與.old結束時,方法應該返回零,而不是發送電子郵件。

然而,在我的單元測試,似乎電子郵件仍然會ActionMailer::Base.deliveries

這裏是我的單元測試:

describe 'BaseNotifier' do 

    class TestNotifier < BaseNotifier 
    def mailer(to, from, subject) 
     mail(:to => to, 
      :from => from, 
      :subject => subject) 
    end 
    end 

    before(:each) do 
    ActionMailer::Base.delivery_method = :test 
    ActionMailer::Base.perform_deliveries = true 
    ActionMailer::Base.deliveries.clear 
    end 

    it "should not send emails to a user with an email that ends in '.old'" do 
    TestNotifier.mailer("[email protected]", "[email protected]", "test email").deliver 
    puts "what do we have here " + ActionMailer::Base.deliveries.first.to_s 
    ActionMailer::Base.deliveries.length.should == 0 
    end 
end 

我創建了一個測試類和子類,其中郵件重寫(這是它將如何在系統中使用)。然後我發一封電子郵件,並致電.deliver方法。

更新:我認爲交付方法不是問題。當我這樣做時:puts TestNotifier.mailer("[email protected]", "[email protected]", "test email")我收到了與以下相同的電子郵件。我也試着重寫郵件方法是這樣的:

def mail(headers={}, &block) 
    #add a check to avoid sending emails that end with ".old" 
    unless headers[:to] =~ /\.old$/ 
    super(headers, &block) 
    else 
    super({:to=>nil, :from=>nil, :boundary =>nil, :date => nil, :message =>nil, :subject =>nil, :mime_version => nil, 
      :content_type => nil, :charset =>nil, :content_transfer_encoding => nil}, &block) 
    end 

end 

,給了我一個失敗與undefined method 'ascii_only?' for nil:NilClass在這條線:TestNotifier.mailer("[email protected]", "[email protected]", "test email").deliver

更新:我也試圖與重寫mail方法這樣做:

#創建一個覆蓋傳遞方法而不做任何事情的類。 class NonSendingEmail; def交付;結束;結束

DEF郵件(頭= {},&塊) #將檢查以避免發送與結束的電子郵件 「名爲.old」 除非頭[:至] =〜/.old$/ 超級(頭,&塊) 其他 NonSendingEmail.new 結束 結束

但我仍然有同樣的結果。

好像deliver方法正在生成一個空的電子郵件?我想要做的是什麼都沒有生成。以下是來自發貨陣列的電子郵件:

Date: Thu, 19 Jan 2012 00:00:00 +0000 
Message-ID: <[email protected]> 
Mime-Version: 1.0 
Content-Type: text/plain 
Content-Transfer-Encoding: 7bit 
+0

我認爲這個問題是軌實例化**的郵件類的事實**,而不是你的,所以你的郵件類,也許它甚至沒有使用 –

+0

@火龍的DoL,何時/何地呢軌實例它的郵件類?哪一個郵件類是你的意思,當你說我的郵件類可能不會被使用? 'TestNotifier.mailer'?或者重寫的'mail'方法? – Ramy

+0

不是我的意思是ActionMailer類,我不知道它在哪裏實例化,但也許軌道保持instanciating ActionMailer類,而不是YourActionMailer.new。請注意,我是**假設**它,否則我會張貼這個答案,但希望這個評論可以指出你應該搜索什麼 –

回答

6

您正在編輯錯誤的地方。將mail方法更改爲返回nil將不會起作用,因爲郵件程序會使用空消息。您可以修改郵件類別(使用rails 3):

module Mail 
    class Message 
    alias :old_deliver :deliver 
    def deliver 
     old_deliver unless to.first =~ /\.old$/ 
    end 
    end 
end 
+0

我會把這個放在哪裏?它是自己的文件,然後'將其包含在BaseNotifier中?將在幾個小時內嘗試。 – Ramy

+0

謝謝!我只是在類定義之前將其放在BaseNotifier.rb的頂部。像魅力一樣工作。 – Ramy

+1

我會把它放在'lib/gem_ext/mail/mail/message.rb'中,因爲這反映了你正在擴展郵件寶石。 – phoet

2

您可以將消息的perform_deliveries設置爲false,例如,

after_filter :do_not_send_if_old_email 

def do_not_send_if_old_email 
    message.perform_deliveries = false if to.first =~ /\.old$/ 
    true 
end 
相關問題