我可以建议您在用户模型上重写destroy
方法,只需执行update_attribute(:deleted_at, Time.current)
(而不是实际销毁),但这种与标准API的偏差可能会在将来成为负担,因此下面是如何修改控制器.
Deviate有一系列现成的默认控制器.定制它们的最佳方法是创建自己的控制器,继承相应的Desive控制器.在本例中,我们讨论的是Devise::RegistrationsController
,这很容易通过查看源代码来识别.所以创建一个新的控制器.
class RegistrationsController < Devise::RegistrationsController
end
现在我们有了自己的控制器,完全继承了Desive提供的所有逻辑.下一步是告诉Desive使用它,而不是默认的.在你的路由上有devise_for
条线.应将其更改为包含注册控制器.
devise_for :users, :controllers => { :registrations => 'registrations' }
这似乎很奇怪,但它是有意义的,因为默认情况下它是"设计/注册",而不是简单的"注册".
下一步是覆盖注册控制器中的destroy
操作.当你使用registration_path(:user), :method => :delete
时,这就是它链接的地方.到destroy
注册控制器的操作.
目前Desive做了以下工作.
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
现在你应该准备好了.使用作用域筛选已删除的用户.