Pergunta

Eu acho que é importante ter um " Desfazer " método ala gmail quando destruindo registros em vez de exibir um pop-up irritante que diz: " Você tem certeza? ".

A maneira que eu implementei isso é ter um "deleted_at" coluna timestamp no modelo que fica timestamped quando destruir método é chamado

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

Para revert / undo eu só vou definir a mesma coluna a zero

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

Eu vou ter que adicionar uma condição para filtrar off "excluído" foos quando eu chamo o método find. Talvez definir um cron ou tarefa de fundo para realmente destruir "excluído" foos depois de algum tempo.

funciona para mim e fácil de implementar, mas estou curioso para saber se há uma maneira melhor para implementar este recurso? Talvez haja um plugin ou gem que fornece esse que eu não sei sobre?

Foi útil?

Solução

De fato, há alguns plugins que podem ser encontradas em Agile Web Development .

Aqui estão os links e resumos para os plugins que parecem corresponder a sua descrição:

  1. Atua como Paranoid : Faça seu Active "paranóico" Registros Excluí-los não excluir a linha, mas definir um campo deleted_at. Find está sobrecarregado para saltar registros excluídos.
  2. Atos tão suave deletable: Oferece a capacidade de modelos ActiveRecord exclusão macios.

Outras dicas

Há um arquivo aqui que parece fazer o que você está exigindo, mas pessoalmente eu acho que deve haver algo lá fora, que automaticamente filtra registros excluídos a menos que você especificamente incluí-los. Dessa forma, eles realmente apareceria excluída a menos que você incluir um parâmetro ou um escopo nomeado que re-inclui-los.

Infelizmente, eu não tenho escrito um e tempo livre é limitado, mas não deve ser tão difícil, deveria?

Você pode mover os itens excluídos em uma recolha selectiva (ou mesa, ou qualquer outro) -, então qualquer coisa que pareça na lista original vai ver que ele foi excluído, e você pode lidar com a nova lista quando é conveniente

PaperTrail faz isso muito bem. Há uma boa Railscast sobre ele, embora seja um pouco velho agora . Eu sei que esta pergunta foi feita há bastante tempo, mas me deparei com ele por curiosidade e pensei que eu deveria fazer referência a um bom atualizado maneira de fazer isso.

padrão de cadeia de responsabilidade

class Action
{
  Perform(context);
  Undo(context);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top