2016-01-28 10 views
7

Klejnot paper_trail śledzi wersje i robi dobrą robotę. Jest jednak jeden skrajny przypadek, który zauważyłem. W przypadku większości obiektów kontroler aplikacji ustawia whodunnit, jeśli jesteś zalogowany, a następnie wszystkie obiekty utworzone podczas tej sesji mają wersję, która zapisuje "whodunnit" w zależności od tego, kto jest zalogowany.Jak ustawić whodunnit na paper_trail podczas tworzenia nowego użytkownika?

Interesującym przykładem jest sytuacja, w której nikt nie jest zalogowany. jest zalogowany, ponieważ nowy użytkownik się rejestruje. Użytkownik jest tworzony z "zerowym" whodunnit, co jest błędne, ponieważ w rzeczywistości użytkownik został stworzony przez siebie.

Oczywiście whodunnit nie może znać identyfikatora użytkownika przed zapisaniem rekordu użytkownika. Wiem to.

Jednak powoduje to konflikt w późniejszym czasie, ponieważ różne zadania wsadowe modyfikują również rekordy użytkowników, a nie są w sesji sieciowej, a także tworzą wersje z rekordami zerowego rekordu whodunnit.

Teraz nie mogę powiedzieć, kto utworzył użytkownika - jakiś proces importowania partii lub użytkownik.

Zastanawiam się nad różnymi rozwiązaniami, takimi jak być może grzebanie po stole Papertrail :: Versions dla tego obiektu i naprawianie whodunnit, ale wydaje się to dość nieczyste.

Każda rada?

Odpowiedz

1

Możesz wymusić whodunnit w akcji tworzenia na kontrolerze.

before_filter :only => [:create] do 
    PaperTrail.whodunnit = "Public User" 
end 

Jeśli nalegać na posiadające identyfikator użytkownika w tabeli wersji, można to zrobić:

ActiveRecord::Base.transaction do 
    @user.save! 
    @user.versions.first.update_attributes(:whodunnit => @user.id) 
end 
Powiązane problemy