Как «мягко удалить» пользователя с помощью Devise - PullRequest
67 голосов
/ 28 февраля 2011

В настоящее время я использую Devise для регистрации / аутентификации пользователей в проекте Rails. Когда пользователь хочет удалить свою учетную запись, объект пользователя уничтожается, что оставляет мое приложение в нежелательном состоянии.

Как проще всего осуществить «мягкое удаление», то есть удалить только личные данные и пометить пользователя как удаленного? Я все еще хочу сохранить все ассоциации записей.

Полагаю, мне придется сначала ввести новый «удаленный» столбец для пользователей. Но тогда я застрял с этим кодом по умолчанию в представлении профиля пользователя:

<p>Unhappy? <%= link_to "Cancel my account", registration_path(resource_name), :confirm => "Are you sure?", :method => :delete %>.</p>

Где я могу найти метод :delete? Как переписать стандартные методы Devise?

Ответы [ 4 ]

103 голосов
/ 28 февраля 2011

Я мог бы посоветовать переопределить метод 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

Теперь у вас все готово. Используйте области, чтобы отфильтровать удаленных пользователей.

89 голосов
/ 13 ноября 2011

Добавление на ответа Хакунина :

Чтобы не допустить входа "мягко удаленных" пользователей, переопределите active_for_authentication? для вашей User модели:

def active_for_authentication?
  super && !deleted_at
end
10 голосов
/ 28 февраля 2011

Вы можете использовать acts_as_paranoid для своей модели User, которая задает в качестве элемента delete_at вместо удаления объекта.

6 голосов
/ 11 июня 2015

Полное руководство можно найти по адресу Софт Удалить учетную запись пользователя Devise на вики-странице Devise.

Сводка:
1. Добавьте столбец DATETIME "Удаленный_кат"
2. Переопределите пользователей / регистрации # уничтожьте в ваших маршрутах
3. Переопределите пользователей / регистрации # уничтожьте в контроллере регистрации
4. Обновите модель пользователя с помощью soft_delete и проверьте, активен ли пользователь при аутентификации
5. Добавьте пользовательское сообщение об удалении

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...