2012-09-12 27 views
3

請原諒這裏的一個基本問題。Rails - 如何避免必須從另一個控制器中的創建動作觸發一個控制器中的創建動作

從讀書的時候,我知道這是不觸發創建另一個控制器的作用最佳實踐 - 我要找的意見如何,我要組織我在以下情況下代碼:

我有兩個控制器:案例和通知。

當創建一個新案例時,我希望它也創建一個新的 通知。

通知創建操作會在其模型 中創建一個新實例併發送電子郵件。

我是否認爲我不應該只是從我的病例控制器調用通知#創建?我應該將這個提取到幫助程序或模塊嗎?如果是這樣,它會是什麼樣子?關於這個主題的其他大致類似的帖子沒有詳細說明。

謝謝。

+0

您可以使用軌道觀察員創建通知http://api.rubyonrails.org/classes/ ActiveRecord/Observer.html – Fivell

+0

謝謝,我設法建立了一個觀察者,在發出新通知時發送通知郵件 - 你會在這種情況下,建議在下面的回調解決方案中使用觀察者? – christian

+0

看到我的答案的更多細節 – Fivell

回答

1

這個邏輯應該在你的模型中。好的解決方案是使用ActiveRecord回調。

# app/models/case.rb 
class Case < ActiveRecord:Base 
    after_create :create_notification 

private  # <--- bottom of your model 
    def create_notification 
    Notification.create!(some_options_for_notification) 
    end 
end 

# app/models/notification.rb 
class Notification < ActiveRecord:Base 
    after_create :send_notification 

def send(opts) 
    ...   # <--- some logic to send notification here 
end 


private  # <--- bottom of your model 
    def send_notification 
    send(some_options_for_sending) 
    end 
end 
+0

謝謝你這個尼克。在這兩種情況下,使用觀察者會更好嗎?他們似乎也是一個很好的解決方案。 – christian

+0

是的,觀察者對於你的情況是一個完美的模式,但是當我的模型邏輯更加複雜時,我更願意使用它。 –

+0

非常感謝您的幫助 – christian

0

您只需在您的案例控制器操作中編寫Notification.create,就是這樣。

您可以編寫儘可能多的代碼,儘可能多地在您的控制器操作中創建儘可能多的模型。

+0

這有點導致另一個問題,如果我只是打電話。創建它不執行通知控制器中的所有代碼,即發送電子郵件...我想觸發控制器創建操作完整。 – christian

+0

在這種情況下,你可以正確過濾器 –

+0

明白了,非常感謝 – christian

3

因爲create是一個POST方法,所以我不認爲有一種方法可以從個案控制器調用通知控制器的create。我的建議是將通知實例的創建和發送郵件邏輯移動到保存案例模型之前。這會在每次創建案例時創建通知,並且還會處理郵件發送機制。由於這是您業務需求的一部分,因此最好將業務邏輯轉移到您的模型中。

+0

偉大的建議,非常感謝 - 我一直困惑觸發從另一個控制器創建行動的可能性。使用像這樣的過濾器從創建操作中刪除其他附加功能是關鍵。 – christian

1

由於可以使用一個選項軌觀察員創建通知http://api.rubyonrails.org/classes/ActiveRecord/Observer.html

有觀察員和回調之間的一些區別,例如觀察家不能取消任何模型的動作,但在你的情況,我認爲無論使用什麼都無所謂。

但是觀察員也習慣堅持單一責任原則。

class CaseObserver < ActiveRecord::Observer 
def after_create(case) 
    #create notification 
end 
end 

應該被保存到/app/models/case_observer.rb.

config/application.rb

config.active_record.observers = :case_observer 
+1

APi ref是註明日期的。在http://api.rubyonrails.org/v3.2.13/classes/ActiveRecord/Observer.html找到另一個 – Medeiros

相關問題