我可以建議覆蓋您的用戶模型中的destroy
方法,以簡單地執行update_attribute(:deleted_at, Time.current)
(而不是實際銷燬),但這種與標準API的偏差可能在未來變得繁重,因此以下是如何修改控制器。
Devise擁有一堆開箱即用的默認控制器。定製它們的最好方法是創建自己的控制器,繼承相應的設計控制器。在這種情況下,我們正在談論Devise::RegistrationsController
- 這很容易通過查看源代碼來識別。所以創建一個新的控制器。
class RegistrationsController < Devise::RegistrationsController
end
現在我們有我們自己的控制器完全繼承所有設計提供的邏輯。下一步是告訴設計使用它而不是默認的。在你的路線中,你有devise_for
行。應該更改爲包含註冊控制器。
devise_for :users, :controllers => { :registrations => 'registrations' }
這似乎很奇怪,但它很有意義,因爲默認情況下它是'設計/註冊',而不僅僅是'註冊'。
下一步是重寫註冊控制器中的destroy
操作。當您使用registration_path(:user), :method => :delete
- 這是它鏈接的地方。到destroy
註冊控制器的行動。
目前設計做到以下幾點。
def destroy
resource.destroy
set_flash_message :notice, :destroyed
sign_out_and_redirect(self.resource)
end
我們可以改用此代碼。首先讓我們給User
模型添加新的方法。
class User < ActiveRecord::Base
def soft_delete
# assuming you have deleted_at column added already
update_attribute(:deleted_at, Time.current)
end
end
# Use this for Devise 2.1.0 and newer versions
class RegistrationsController < Devise::RegistrationsController
def destroy
resource.soft_delete
Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name)
set_flash_message :notice, :destroyed if is_navigational_format?
respond_with_navigational(resource){ redirect_to after_sign_out_path_for(resource_name) }
end
end
# Use this for older Devise versions
class RegistrationsController < Devise::RegistrationsController
def destroy
resource.soft_delete
set_flash_message :notice, :destroyed
sign_out_and_redirect(resource)
end
end
現在你應該全部設置。使用範圍來過濾已刪除的用戶。
刪除用戶時應該發生什麼?他的所有帖子/活動是否應該被刪除? – khelll 2011-02-28 10:25:03
我想保留與其他對象的所有關聯,但只刪除個人數據(名稱/電子郵件地址)並禁用登錄。 – slhck 2011-02-28 10:34:00