Je pourrais conseiller de remplacer destroy
sur votre modèle d'utilisateur pour simplement faire update_attribute(:deleted_at, Time.current)
(au lieu de la détruire réellement), mais cet écart par rapport à l'API standard pourrait devenir fastidieux à l'avenir. Voici donc comment modifier le contrôleur.
Devise a un tas de contrôleurs par défaut dans la boîte. La meilleure façon de les personnaliser est de créer votre propre contrôleur en héritant du contrôleur Devise correspondant. Dans ce cas, nous parlons de Devise::RegistrationsController
- qui est facilement reconnaissable en regardant la source. Donc, créez un nouveau contrôleur.
class RegistrationsController < Devise::RegistrationsController
end
Maintenant, nous avons notre propre contrôleur qui hérite de toute la logique fournie par l'appareil. La prochaine étape est de dire à devise de l'utiliser à la place du contrôleur par défaut. Dans vos routes, vous avez devise_for
ligne. Elle doit être modifiée pour inclure le contrôleur des enregistrements.
devise_for :users, :controllers => { :registrations => 'registrations' }
Cela semble étrange, mais c'est logique car, par défaut, il s'agit de "devise/registrations", et pas simplement de "registrations".
L'étape suivante consiste à remplacer le destroy
action dans le contrôleur des enregistrements. Lorsque vous utilisez registration_path(:user), :method => :delete
- c'est là qu'il y a un lien. À destroy
action du contrôleur des enregistrements.
Actuellement, devise fait ce qui suit.
def destroy
resource.destroy
set_flash_message :notice, :destroyed
sign_out_and_redirect(self.resource)
end
Nous pouvons à la place utiliser ce code. Tout d'abord, ajoutons une nouvelle méthode à User
modèle.
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
Maintenant, vous devriez être prêt. Utilisez les scopes pour filtrer les utilisateurs supprimés.