2008-10-14 3 views
15

Je pense qu'il est important d'avoir un « undo » méthode ala gmail lors de la destruction des documents au lieu d'afficher un popup ennuyant qui dit: « Êtes-vous sûr? ».Quelle est la meilleure façon d'implémenter le style Gmail "Annuler" dans Rails?

La façon dont je l'ai mis en œuvre est d'avoir une colonne d'horodatage « de deleted_at » dans le modèle qui obtient horodaté lorsque méthode destroy est appelé

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

Pour revert/undo Je vais vient de mettre la même colonne à zéro

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

Je vais juste d'ajouter une condition pour filtrer « supprimé » foos quand je l'appelle la méthode de recherche. Peut-être définir une tâche cron ou arrière-plan pour vraiment détruire les foos "supprimés" après un certain temps.

Fonctionne pour moi et 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 qu'il y a un plugin ou une gemme qui fournit cela que je ne connais pas?

+0

Est-ce que vous vous souciez vraiment de sa suppression? Un drapeau n'est-il pas suffisant? –

+4

Oui, je ne me soucie pas vraiment quand il a été supprimé pour l'instant, mais cette connaissance pourrait être utile sur toute la ligne. En tout cas je pense que les timestamps font un bon drapeau. – JasonOng

+1

Je suis d'accord avec le sentiment général.Cependant, un problème possible en prévoyant des besoins comme celui-ci est que cela pourrait amener d'autres développeurs à chercher où cette information (horodateur) est actuellement utilisée. Quand il n'est pas réellement utilisé quelque part, il représente un fil lâche, ce qui est souvent frustrant et prend du temps pour les non-initiés. – Magne

Répondre

4

Il y a en effet quelques plugins que l'on peut trouver au Agile Web Development.

Voici les liens et résumés pour les plug-ins qui semblent correspondre à votre description:

  1. Acts as Paranoid: Faites votre Active Records « paranoïaque. » Les supprimer ne supprime pas la ligne, mais définit un champ deleted_at. La recherche est surchargée pour ignorer les enregistrements supprimés.
  2. Acts as soft deletable: Offre la possibilité de supprimer en douceur les modèles ActiveRecord.
+0

On dirait que les actions Comme Paranoid pourrait avoir des problèmes avec les futures versions d'ActiveRecord car il surcharge la méthode find. Agit comme Soft Deletable a l'air bien. Je me demande simplement si la table deleted_dable est désynchronisée, comment la resynchroniser? Avez-vous déjà utilisé l'un d'entre eux? – JasonOng

+0

Non, mais dans la description de soft deletable il est dit qu'il a des méthodes d'aide intégrées pour les garder en synchronisation – Tilendor

+0

Un bref examen des deux fait apparaître comme des actes comme soft deletable serait le meilleur choix, à la fois pour la méthode utilisée et le fait qu'il semble être mieux maintenu. –

0

Il y a un fichier here qui semble faire ce que vous êtes exigeant, mais personnellement, je pense qu'il doit y avoir quelque chose là-bas que les filtres automatiquement les enregistrements supprimés, sauf si vous incluez spécifiquement. De cette façon, ils apparaîtraient réellement supprimés à moins que vous n'incluiez un paramètre ou une étendue nommée qui les inclut de nouveau.

Malheureusement, je n'en ai pas écrit un et le temps libre est limité, mais ça ne devrait pas être si difficile, n'est-ce pas?

-1

modèle de chaîne de responsabilité

class Action 
{ 
    Perform(context); 
    Undo(context); 
} 
+2

Ceci est très vague et ne me donne aucune idée sur la façon de faire l'annulation. quel est le contexte? comment interagit-il avec la base de données? – Tilendor

0

Vous pouvez déplacer les éléments supprimés dans une collection séparée (ou une table, ou autre) - alors tout ce qui regarde dans la liste initiale verra qu'il a été supprimé, et vous pouvez faire face à la nouvelle liste quand c'est pratique.

0

PaperTrail le fait bien. Il y a un bon Railscast dessus, 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é par hasard sur la question et j'ai pensé que je devrais faire référence à un bon moyen de le faire.

Questions connexes