Problem z rejestrowaniem wydarzeń

Na podstawie przepisów i tego co na necie wygrzebałem ukulałem coś takiego:

[code=ruby]class ActionSweeper < ActionController::Caching::Sweeper

observe User

def after_destroy(record)
log(record, “DESTROY”)
end

def after_create(record)
log(record, “CREATE”)
end

def after_update(record)
log(record, “UPDATE”)
end

def log(record, event, user = controller.session[:user])
ActionTrail.create(:record_id => record.id, :record_type => record.type.name, :event => event, :user_id => user)
end

end[/code]
Jednak nie wiem jak mógłbym porównać dane rekordu sprzed i po edycji? Zależy mi na tym abym mógł napisać kod który dostanie dany obiekt przed edycją i po edycji, z resztą sobie poradzę. Jednak z tym mam problem…

EDIT:
2gi problem polega na tym, że to nie działa… W user_controller.rb mam wpis cache_sweeper :action_sweeper
Oraz włączone cachowanie w środowisku.

Akcje na User wykonuję spod konsoli, robi to jakąś różnice?

EDIT2:
Zmieniłem to na observera, coś już więcej działa, niestety z poziomu konsoli wywala się przy zmiennej controller.

No oczywiscie ze robi roznice, w konsoli nie masz ustawianego controllera. Ogolnie uzywanie sweepera od cachu do robienia logowania jest troche dziwne, wydaje mi sie ze nie do tego zostal zaprojektowany.
Mozesz uzyc tego plugina http://github.com/airblade/paper_trail
albo
wyciagnac z niego tylko ten modul http://github.com/airblade/paper_trail/blob/master/lib/paper_trail.rb zeby miec dostep do uzytkownika ktory edytowal, i uzywac zwyklych observerow

Jak chcesz do loga zapisywać obiekt przed zmianami, to musisz po prostu wywoływać callbacki before, bo domyślam się że record, to jest aktualny stan rekordu obiektu w bazie

Hm, dobre narzędzie ale nie potrzebuję czegoś aż tak dużego, zależy mi tylko na uchwyceniu rekordu przed i po edycji. Chciałbym też samemu to napisać żeby zrozumieć. Tzn. z pomocą z forum :wink:


EDIT:

@Piotr Misiurek: Tak, ale nie wiem w jaki sposób mogę to zrobić żeby to zadziałało poprawnie. Załóżmy:

[code=ruby]before_create(record)
??? = record
end

after_create(record)

działanie na ???

end[/code]
Powiem szczerze że nie wiem jak działa wywołanie tych metod, tak więc nie wiem czy wystarczy że zrobię zmienną instancji w ramach ‘???’ ?


EDIT2:

Zmienna instancyjna zadziała, jednak potem okazało się że jest to niepotrzebne, aktualnie wygląda to tak:

[code=ruby]class ActionObserver < ActiveRecord::Observer

observe User

def after_destroy(record)
log(record, YAML::dump(record),“DESTROY”)
end

def after_create(record)
log(record, YAML::dump(record),“CREATE”)
end

def after_update(record)
log(record, YAML::dump(record),“UPDATE”)
end

def log(record, event, user = controller.session[:user])
ActionTrail.create(
:record_id => record.id,
:record_type => record.class.name,
:event => event,
:user_id => user,
:record_dump => record_dump
)
end

end[/code]
record_dump zawiera wszystkie informacje, czy został stworzony, czy usunięty a jeśli zmieniony to atrybuty które zostały zmienione są podane przed i po.

http://railscasts.com/episodes/109-tracking-attribute-changes