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



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



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



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



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


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

558   4  

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

    Ничего не найдено.