Как "мягкое удаление" пользователя с помощью Devise
в настоящее время я использую Devise для регистрации/аутентификации пользователей в проекте Rails. Когда пользователь хочет отменить свою учетную запись, объект пользователя уничтожается, что оставляет мое приложение в нежелательном состоянии.
какой самый простой способ реализовать "мягкое удаление", т. е. только удаление личных данных и маркировка пользователя как удаленного? Я все еще хочу сохранить все записи ассоциаций.
Я предполагаю, что мне придется сначала ввести новый столбец "удалено" для пользователей. Зато Я застрял с этим кодом по умолчанию в профиле пользователя:
<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>
где я могу найти :delete способ? Как я должен перезаписать методы Devise по умолчанию?
4 ответов:
я мог бы посоветовать переопределение
destroyметод на вашей модели пользователя, чтобы просто сделатьupdate_attribute(:deleted_at, Time.current)(вместо фактического уничтожения), но это отклонение от стандартного API может стать обременительным в будущем, поэтому вот как изменить контроллер.Devise имеет кучу контроллеров по умолчанию из коробки. Лучший способ настроить их-создать свой собственный контроллер, наследующий соответствующий контроллер devise. В данном случае речь идет о
Devise::RegistrationsController- который легко распознается, глядя на источник. Так что создайте новый контроллер.class RegistrationsController < Devise::RegistrationsController endтеперь у нас есть собственный контроллер, полностью наследующий всю логику, предусмотренную devise. Следующий шаг-сказать 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
добавляем ответ хакунина:
чтобы предотвратить вход "мягко удаленных" пользователей, переопределите
active_for_authentication?наUserмодель:def active_for_authentication? super && !deleted_at end
вы могли бы использовать acts_as_paranoid для вашей модели пользователя, которая устанавливает deleted_at вместо удаления объекта.
полный учебник можно найти на мягкое удаление учетной записи Пользователя Devise на вики-странице Devise.
резюме:
1. Добавьте столбец DATETIME "deleted_at"
2. Переопределение пользователей / регистраций#уничтожить в ваших маршрутах
3. Переопределение пользователей / регистраций#уничтожить в контроллере регистраций
4. Обновите модель пользователя с помощью soft_delete и проверьте, активен ли пользователь при аутентификации
5. Добавьте пользовательское сообщение об удалении
Comments