2010-02-08 11 views
6

Czy ktoś zaimplementował haczyk after_commit w Railsach? Nie szukam dla modelu opartego po zatwierdzeń dotyczących aktualizacji/tworzyć/etc, chcę, aby móc dynamicznie zdefiniować blok, który zostanie wykonany tylko wtedy, gdy prąd (top-najbardziej) transakcja przechodzi:Railsy after_commit?

def remove_file 
    current_transaction.after_commit do 
    FileUtils.rm(file_path) 
    end 
end 

Any pomysł, czy to zostało już zaimplementowane, czy ma być w szynach 3.0?

+0

nie można zrobić after_save i sprawdzić, czy obiekt został zaktualizowany? – marcgg

+0

To działałoby, jeśli transakcja zawija operację składowania pojedynczego modelu. Muszę owinąć co najmniej 'Węzeł + Wersja + Załącznik' ... – gaspard

Odpowiedz

2

Nie zobaczysz after_commit w Rails 3.0, przynajmniej jeszcze nie. Możesz zastosować łatkę i sprawdzić, czy jest ona zatwierdzona przez zespół główny, ale wątpię, by tak się stało. Ta funkcjonalność pozostaje znacznie bardziej funkcjonalna poza rdzeniem Rails w wtyczce.

Można spróbować tej wtyczki:

http://github.com/GUI/after_commit

+0

Spojrzałem na wtyczkę, ale jest to statyczny sposób definiowania po zatwierdzeniu i są one podpięte do jednego modelu z tego, co zobaczyłem. Wolałbym coś, co dodasz do zwrotów 'after_commit' podczas zapisywania. – gaspard

1

I stworzyli lekką wtyczki after_commit: after_commit plugin który umożliwia następującą składnię:

def some_callback 
    after_commit do 
    # save file, expire cache, etc 
    end 
end 

Jest bardzo lekki, ale spełnia swoje zadanie.

1

Ponieważ OP pyta o dynamiczne ustawienie kodu do wykonania po zatwierdzeniu transakcji, after_commit nie rozwiązuje problemu. Na szczęście istnieje klejnot after_commit_queue, który rozwiązuje dokładnie ten problem.

Korzystanie przykład OP, kod wyglądałby następująco:

include AfterCommitQueue 

def remove_file 
    run_after_commit do 
    FileUtils.rm(file_path) 
    end 
end