2011-04-06 49 views
0

請原諒這種簡單和長度,但我有一個測試應用程序,它有一個用戶表,名稱,電子郵件和工資屬性。我創建了一個郵件程序,可以根據我的判斷將這些數據的報告發送給特定用戶,換句話說,當我單擊按鈕時。我的按鈕是使用link_to創建的,並在我的主users_controller中調用一個動作,然後調用郵件動作。 (我希望這是有道理的)。它看起來像下面這樣,正在按照我的希望工作;我只是希望知道這是做這樣的事情的正確方法:我這樣做是否正確 - 從link_to調用控制器的動作

在我users_controller(由腳手架生成創建):

def sendemail 
@user = User.find(params[:id]) 
UserMailer.welcome_email(@user).deliver 
redirect_to user_path(@user) 
flash[:notice] = 'Email has been sent!' 
end 

在user_mailer.rb文件:

def welcome_email(user) 
@user = user 
@url = "http://example.com/login" 
mail(:to => user.email, 
    :subject => "Welcome to My Awesome Site") 
end 

在用戶show.html.erb頁面,這是電子郵件被髮送方式:

<%= link_to "Send Email", sendemail_user_path(@user) %> 

在我的routes.rb文件,讓一切都正確執行(其它):

resources :users do 
member do 
get 'sendemail' 
end 

所以,說了這麼多,它的工作原理就像它應該。我點擊用戶的show.html.erb頁面,在那裏我將顯示最終要顯示的數據和圖表,並根據我的判斷,我可以用這些數據向用戶發送一封電子郵件,或者我放入mailer.html.erb文件。當它被髮送時,它會閃爍我在控制器中指定的消息,並將我留在該頁面上,就像我指定的那樣;所以它的工作。我只想知道,這是正確的,最紅寶石/高尚的做事方式嗎?

回答

0

此代碼看起來與Rails Guides Action Mailer示例非常相似,因此可以說您正在創建railsy代碼。另外,如果你的應用程序發展到一個更加宏大的規模,你會想要考慮通過後臺作業來發送郵件,以避免郵件傳遞阻塞當前線程。

否則代碼看起來不錯。當然,你最有可能在控制器中取得成功之後發送一封電子郵件,而不是直接發送專門的郵件。例如,您可能有一個welcome操作,該操作會在成功保存用戶記錄時發送電子郵件。

+0

感謝您的回覆和反饋。你能解釋一下你的意思嗎?「考慮通過後臺作業發送電子郵件以避免郵件阻塞當前線程」 – FattRyan 2011-04-06 19:45:40

+0

@FattRyan - 當然。因此,在這種簡單的情況下,這並不是真的必要,但如果您試圖從控制器向陣列中的多個用戶發送電子郵件,則控制器方法會阻止,直到所有這些電子郵件都發出。您不必讓用戶等待Action Mailer完成發送這些電子郵件,而是希望在後臺發送這些電子郵件,並讓控制器儘快向用戶返回一個視圖。我的觀點是關於應用程序對用戶的響應。此外,如果電子郵件失敗,您希望控制器失敗(因此返回視圖失敗) – McStretch 2011-04-06 19:56:16

+0

或者您是否想在後臺處理錯誤,並且如果出現任何錯誤,請在後臺重新發送電子郵件?如果可能的話,通常最好在主代碼路徑之外保留長操作。在電子郵件的情況下,通常可以將它們發送到幕後,並隨着將任何查看數據立即返回給用戶一起移動。這是否清除它? – McStretch 2011-04-06 19:57:45

相關問題