2013-08-27 117 views
0

我不想在用戶刪除他的帳戶時通知管理員。我的想法是使用before_destroy驗證從模型中發送電子郵件。Rails devise before_destroy用戶

這可能是在控制器中做得更好,但我不想爲設計控制器子類化,因爲我認爲我可能會破壞某些東西。

問題是模型無法訪問current_user,這是我第一次想到如何「獲取」相應的用戶帳戶。但是模型必須知道哪個用戶帳戶被銷燬了,對嗎?所以必須傳遞某種變量。

我已經看着github上的設計控制器,它似乎像一切都使用「資源」完成。

https://github.com/plataformatec/devise/blob/master/app/controllers/devise/registrations_controller.rb

我想不通的最後一部分,我怎麼能訪問ID /或用戶對象?

+0

使用觀察者。如果發生破壞,請發送電子郵件。 – sircapsalot

+0

我不明白。如果用戶正在刪除自己的帳戶,那麼您已經*認識*當前用戶 - 這是正在被刪除的用戶模型對象。 –

+0

這意味着它是「自我」beeing摧毀?所以我可以說「self.id」來獲取用戶的ID? – Linus

回答

2

簡單模型中添加一個鉤和發送郵件..

class User < ActiveRecord::Base 

    before_destroy :notify_admin 


    private 

    def notify_admin 
    YourMailer.user_destroyed(self).deliver 
    end 

end 

的 「自我」 將是你CURRENT_USER對象..

+0

非常感謝您!我在這一點上,但以下失敗,這不可能嗎? (在notify_admin方法中:@user = User.find(self).includes([:courses,:enrollments])。scoped – Linus

+0

你已經擁有實例了......你一定不要再找到它:-)。我不知道你的數據庫模式,但我認爲你必須改變你的查詢。我會建議在實例級而不是在班級上工作,因爲您已經擁有實例。 – Mattherick

+0

課程和註冊是兩個has_many /通過用戶關係。嗯好吧,我明白你的意思是關於實例,但我需要包含這些關係,以儘量減少以後的SQL查詢。這不是通過模型完成的嗎? – Linus

1

類似的東西可以工作:

class Users::RegistrationsController < Devise::RegistrationsController 
def destroy 
    # You have access to current_user here 
    # So you can do your thing 

    super 
end 
+0

我如何/將在哪裏命名和放置文件?然後做其他的超級工作方法嗎?或者我必須定義每個人並呼籲超級? – Linus

+0

'app/controllers/users/registrations_controller.rb'。 – bredikhin

+0

同時一定要在你的'routes.rb'一些像這樣的映射: 'devise_for:用戶, :控制器=> { :註冊=> '用戶/註冊' }' – bredikhin