Подтвердить что ты не робот

Как "мягко удалить" пользователя с помощью

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

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

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

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

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

4b9b3361

Ответ 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

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

Ответ 2

Добавление на hakunin answer:

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

def active_for_authentication?
  super && !deleted_at
end

Ответ 3

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

Ответ 4

Полный учебник можно найти в "Мягкое удаление учетной записи пользователя" на странице вики-разработки.

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