Question

Je pense qu'il est important d'avoir un " annuler ". method ala gmail lors de la destruction d'enregistrements au lieu d'afficher une fenêtre contextuelle gênante indiquant: " Êtes-vous sûr? ".

La façon dont j'ai implémenté cela est d'avoir un " delete_at " La colonne timestamp du modèle est horodatée lorsque la méthode destroy est appelée

.
def destroy
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, Time.now)
  ...
end

Pour rétablir / annuler , je vais définir la même colonne sur nil

.
def revert
  @foo = Foo.find(params[:id])
  @foo.update_attribute(:deleted_at, nil)
  ...
end

Il me suffira d'ajouter une condition pour filtrer les "supprimés". foos quand j'appelle la méthode find. Peut-être définir une tâche cron ou d’arrière-plan pour réellement détruire " supprimé " foos après un certain temps.

Fonctionne pour moi et est facile à mettre en œuvre, mais je suis curieux de savoir s’il existe une meilleure façon de mettre en œuvre cette fonctionnalité. Peut-être y a-t-il un plugin ou un joyau qui fournit ce que je ne connais pas?

Était-ce utile?

La solution

Il existe en effet des plugins disponibles à l'adresse Développement Web agile .

Voici les liens et résumés des plugins qui semblent correspondre à votre description:

  1. se comporte comme un paranoïde : faites en sorte que vos enregistrements actifs soient paranoïaques. " Leur suppression ne supprime pas la ligne, mais définit un champ delete_at. La recherche est surchargée pour ignorer les enregistrements supprimés.
  2. Agit en tant que suppression douce : offre la possibilité de supprimer en douceur les modèles ActiveRecord.

Autres conseils

Il existe un fichier ici qui semble ce dont vous avez besoin, mais personnellement, je pense qu’il doit exister quelque chose qui filtre automatiquement les enregistrements supprimés, à moins que vous ne les incluiez spécifiquement. De cette façon, ils sembleraient réellement supprimés, sauf si vous incluez un paramètre ou une étendue nommée qui les ré-inclut.

Malheureusement, je n'en ai pas écrit et le temps disponible est limité, mais cela ne devrait pas être si difficile, non?

Vous pouvez déplacer les éléments supprimés vers une collection (ou un tableau, ou autre) distinct. Ainsi, tout ce qui apparaît dans la liste d'origine verra qu'il a été supprimé et vous pourrez gérer la nouvelle liste quand vous le souhaitez.

PaperTrail le fait bien. Il y a un bon Railscast , bien qu'il soit un peu vieux maintenant . Je sais que cette question a été posée il y a un certain temps, mais je suis tombé sur elle par curiosité et j'ai pensé que je devrais faire référence à une façon agréable et moderne de procéder.

modèle de chaîne de responsabilité

class Action
{
  Perform(context);
  Undo(context);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top