我建议destroy
用户模型上的重写方法可以简单地执行update_attribute(:deleted_at, Time.current)
(而不是实际销毁),但是将来与标准API的这种偏离可能会变得繁重,因此,这里介绍了如何修改控制器。
Devise提供了许多默认控制器。定制它们的最佳方法是继承相应的devise控制器来创建自己的控制器。在这种情况下,我们正在谈论Devise::RegistrationsController
-通过查看源很容易识别。因此,创建一个新的控制器。
class RegistrationsController < Devise::RegistrationsController
end
现在,我们有了自己的控制器,它完全继承了所有由设备提供的逻辑。下一步是告诉devise使用它而不是默认值。在您的路线中您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
update_attribute(:deleted_at, Time.current)
end
end
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
class RegistrationsController < Devise::RegistrationsController
def destroy
resource.soft_delete
set_flash_message :notice, :destroyed
sign_out_and_redirect(resource)
end
end
Now you should be all set. Use scopes to filter out deleted users.