Qual è il modo migliore per implementare lo stile di Gmail & # 8220; annulla & # 8221; in Rails?
-
03-07-2019 - |
Domanda
Penso che sia importante avere un " annulla " metodo ala gmail quando si distruggono i record invece di visualizzare un fastidioso popup che dice, " Sei sicuro? " ;.
Il modo in cui l'ho implementato è di avere un " delete_at " colonna timestamp nel modello che viene timestamp quando viene chiamato il metodo distruggere
def destroy
@foo = Foo.find(params[:id])
@foo.update_attribute(:deleted_at, Time.now)
...
end
Per ripristina / annulla imposterò la stessa colonna su zero
def revert
@foo = Foo.find(params[:id])
@foo.update_attribute(:deleted_at, nil)
...
end
Dovrò solo aggiungere una condizione per filtrare " cancellato " foos quando chiamo il metodo find. Forse imposta un'attività cron o in background per distruggere veramente " cancellato " dopo qualche tempo.
Funziona per me e è facile da implementare ma sono curioso di sapere se esiste un modo migliore per implementare questa funzione? Forse c'è un plug-in o una gemma che fornisce questo che non conosco?
Soluzione
Esistono davvero alcuni plugin che possono essere trovati su Sviluppo Web agile .
Ecco i collegamenti e le sintesi per i plugin che sembrano corrispondere alla tua descrizione:
- Agisce come paranoico : rendi i tuoi record attivi " paranoid. " La loro eliminazione non elimina la riga, ma imposta un campo delete_at. Trova è sovraccarico per saltare i record eliminati.
- Funziona come eliminazione soft : offre la possibilità di eliminare gradualmente i modelli ActiveRecord.
Altri suggerimenti
Esiste un file qui quello che stai richiedendo, ma personalmente penso che ci debba essere qualcosa là fuori che filtra automaticamente i record cancellati a meno che tu non li includa specificamente. In questo modo sembrerebbero davvero cancellati a meno che tu non includa un parametro o un ambito denominato che li includa nuovamente.
Purtroppo non ne ho scritto uno e il tempo libero è limitato, ma non dovrebbe essere così difficile, vero?
Puoi spostare gli elementi eliminati in una raccolta separata (o tabella, o qualsiasi altra cosa), quindi tutto ciò che appare nell'elenco originale vedrà che è stato eliminato e puoi gestire il nuovo elenco quando è conveniente.
PaperTrail lo fa bene. C'è un buon Railscast , sebbene sia un po 'vecchio ora . So che questa domanda è stata posta un po 'di tempo fa, ma mi sono imbattuto in esso per curiosità e ho pensato di fare riferimento a un modo aggiornato e aggiornato di farlo.
modello di catena di responsabilità
class Action
{
Perform(context);
Undo(context);
}