Я мог бы посоветовать переопределить метод 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
действию регистрационного контроллера.
В настоящее время devise выполняет следующие действия.
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
Теперь у вас все готово. Используйте области, чтобы отфильтровать удаленных пользователей.