2009-02-03 43 views
18

發送電子郵件通常在對模型執行操作後調用,但電子郵件本身是查看操作。我正在尋找你如何考慮問什麼問題來問問自己,以確定在哪裏放置動作郵件程序方法調用。ActionMailer最佳實踐:在模型或控制器中調用方法?

我見過/使用它們:

  • 在模型方法 - 相關,但單獨的擔憂糟糕的耦合?
  • 在模型中的回調(比如after_save) - 根據我目前的知識水平可以看出最佳分離。
  • 在控制器動作 - 只是感覺不對,但是有沒有這種情況是最聰明的方式來構造代碼?

如果我想知道如何編程,我需要這樣想一個程序員,所以學習你如何通過特定的編程解決方案的想法是孤立我自己編碼的身價個月。謝謝!

回答

12

晚的答案,但我要理順這個話題:

通常,在一個Web應用程序,你要發送的郵件無論是作爲一個客戶的直接反應。或作爲背景任務,以防我們正在談論通訊/通知郵件類的事情。

該模型基本上是一個數據存儲映射器。其邏輯應該將數據處理/通信與數據存儲處理封裝在一起。因此,插入與其無關的邏輯有點棘手,並且在大多數情況下是錯誤的。讓我們舉個例子:用戶註冊一個帳戶,並應該收到一封確認郵件。在這種情況下,人們可以說,確認電子郵件是創建新帳戶的直接結果。現在,不要在Web應用程序中執行此操作,請嘗試在控制檯中創建一個用戶。在這種情況下觸發回撥聽起來不對,對吧?所以,回調選項劃痕。我們是否還應該在模型中編寫該方法?那麼,如果它是用戶操作/輸入的直接影響,那麼它應該保留在該工作流程中。在成功創建用戶後,我會將它寫入控制器。直。在控制器中調用模型中的這個邏輯反正會增加不必要的模塊性,並且增加了Action Mailer中Active Record模型的依賴性。嘗試考慮在許多應用程序中共享模型,其中一些應用程序不需要Action Mailer。由於陳述的原因,我認爲郵件的呼叫應該是他們有意義的地方,通常這個地方的型號是而不是。試着給我舉例說明它的作用。

+1

我看錯了嗎,還是你自相矛盾? 「直接在用戶成功創建後,我會將它寫入控制器。」那麼後來「由於陳述的原因,我認爲郵件調用應該是他們有意義的地方,通常這個模型就是那個地方。」 – Cameron 2014-09-17 22:26:06

4

嗯,要看。

我已經使用了所有這些選項以及你爲什麼要把它放在哪裏?很好。

如果這是我希望每次以某種方式更新模型時發生的事情,那麼我就把它放在模型中。甚至可能在模型中回調。

有時你只是在發佈報告;沒有任何更新。在這種情況下,我通常會收到一個資源,並附帶索引操作來發送報告。

如果郵件程序與正在更改的模型沒有真正關聯,則可以將其置於回調中。我不經常這樣做。我更有可能仍將其封裝在模型中。我做到了,只是不經常。

1

我知道這是一段時間,但最佳實踐永遠不會死,對吧?:)

電子郵件按定義異步通信(除了確認電子郵件,但即使是這一個,它應該是一個最好的做法,以在必須確認之前留下延遲)。

因此,在我看來,送它最合理的方式是:

    在後臺動作
  • (使用Sidekiqdelayed_job)在回調方法
  • :「嘿,這個動作成功完成,也許我們現在可以告訴世界嗎?「

問題在Rails的是,它是太多回調沒有(如JS爲例):我personnaly覺得髒有這樣的代碼:

after_save :callback 

def callback 
    if test_that_is_true_once_in_the_objects_life 
    Mailer.send_email() 
    end 
end 

所以,如果你真的想想像一個程序員,這個想法是在你的應用程序中設置一些自定義回調系統。

例如,

def run_with_callback(action, callback_name) 
    if send(action) 
    delay.send(callback_name) 
    end 
end 

甚至creating an event system in your app將是一個體面的解決方案。

但最終的解決方案是相當昂貴的時間,使人們最終行動了

def activate 
    [...] 
    user.save 
    Mailer.send_mail 
    respond_to 
    [...] 
end 

這是最接近時尚同步編程回調,並具有郵件程序調用處處結果後直列寫它(在ModelController)。

0

有幾個原因控制器是爲郵寄的好去處:

  • 電子郵件,什麼都沒有做一個模型。
  • 如果您的電子郵件依賴於不知道彼此的幾個模型。
  • 將模型提取到API不應該意味着重新實現郵件程序。
  • 郵件內容由您不想傳遞給模型的請求變量確定。
  • 如果您的商業模式需要大量不同的電子郵件,則模型回調可以堆疊。
  • 如果電子郵件不依賴於模型計算的結果。
相關問題