Ответ 1
Я бы посоветовал переопределить метод destroy
на вашей модели пользователя, чтобы просто сделать update_attribute(:deleted_at, Time.current)
(вместо фактического уничтожения), но это отклонение от стандартного API может стать обременительным в будущем, поэтому здесь, как изменить контроллер.
У разработчика есть куча контроллеров по умолчанию. Лучший способ их настройки - создать собственный контроллер, наследующий соответствующий контроллер. В этом случае речь идет о 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
Теперь вы должны быть настроены. Используйте области действия, чтобы отфильтровать удаленных пользователей.