2012-10-26 11 views
6

Witam Mam osobliwy problem. Do wysyłania powiadomień używam wywołania zwrotnego after_commit, ale wygląda na to, że wywołanie zwrotne w ogóle się nie uruchamia. Uproszczona sytuacja wygląda następująco:Szyny nie uruchamiają mojego wezwania zwrotnego after_commit

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    raise 'Doing something' 
    end 
end 

Następnie spodziewałem się zobaczyć podwyżkę po otwarciu konsoli i utworzeniu wiadomości. Ale nic się nie dzieje. Ponadto szyny nawet nie narzekają, jeśli całkowicie usunę metodę "do_something". Zauważ, że nie jest to test z urządzeniami transakcyjnymi. Widzę nawet rekord popełniony w bazie danych. Moja wersja rails to 3.0.9. Dziękuję za wszelką pomoc, zwłaszcza jeśli jest dobra :-)

Edycja: Dowiedziałem się później, że wywołanie zwrotne DID zostało wyzwolone po wdrożeniu kodu na innym komputerze. To musi być coś z moją konfiguracją. Mimo to byłbym wdzięczny za wgląd w to, co może być przyczyną tego.

Edycja2: Z komentarzy.

  • DB to MySQL, więc transakcje są obecne.
  • Określenie działania wywołania zwrotnego nie pomogło (: on =>: create).
  • muszę after_commit i żadna inna funkcja zwrotna
+0

Jak tworzysz model w konsoli – felipeclopes

+0

Próbowałem go poprzez fabryki, a także poprzez strzał i zapisać zadzwoń pod numer – Renra

+0

Jak rozumiem, wszystkie powinny wywoływać wywołania zwrotne, próbowałem też z konsoli produkcyjnej – Renra

Odpowiedz

3

David wspomniane wyjaśnienia dla tego zachowania w komentarzu pytania.

Transaction Callbacks documentation

„Jeśli jakieś wyjątki są podnoszone w jednym z tych wywołań zwrotnych, będą być ignorowane, tak aby nie kolidowały z innymi wywołań zwrotnych. Jak takie, jeśli kod zwrotna może podnieść Wyjątkiem jest , aby go uratować i odpowiednio obsłużyć w ramach wywołania zwrotnego."

zobacz także:

-2

masz następujący:

class Message < ActiveRecord::Base 
    after_commit :do_something 

    def do_something 
    puts 'Doing something' 
    end 
end 

Możesz spróbować z after_create lub after_save w zależności od potrzeb.

po_komendy są wykonywane po pomyślnym zapisaniu rekordu w bazie danych, ponieważ zapisz, zapisz! i niszczyć przebiegi w ramach transakcji.

Jak znaleźć w dokumentacji: Active Record Callbacks

+4

Szczególnie potrzebuję after_commit, ponieważ after_create może zostać wykonane, ZANIM rekord faktycznie zostanie zatwierdzony w db aby pozostałe połączenia mogły ją również przeczytać. A jeśli wyślesz powiadomienie do innego urządzenia z identyfikatorem rekordu, a rekord jeszcze nie istnieje -> nic się nie dzieje. – Renra

0

Należy określić działania, gdy ten after_commit musi być wywołane ....

after_commit jest zasadniczo stosowany w tych bazach danych, gdzie pojęcie transakcji jest obecny .. .so spróbować następujący kod ...

class Message < ActiveRecord::Base 
after_commit :do_something, :on => [:create, :update, :destroy] 

def do_something 
    raise 'Doing something' 
end 
end 
+0

Myślałem tak samo, ale to nie pomogło. – Renra

+0

Dobrze, zapomniałem wspomnieć, że DB to MySQL. – Renra

+0

Myślę, że nie powinno to mieć większego znaczenia ponieważ beczy MySQL i Sqlite będą obsługiwać transakcje, a jeśli nie działa na MySQL, to nie uruchomi też SQLite ... ale mimo to możesz spróbować i dać mi znać wyniki. .. –

0

spróbować, jeśli poniżej kod pomaga -

class Message < ActiveRecord::Base 
after_commit :do_something, :only => [:create, :update, :destroy] 

def do_something 
    raise 'Doing something' 
end 
end 
+0

Nno, to nie pomogło. Zobacz drugą edycję pytania. Ale i tak dzięki. – Renra

1

Być może będziesz musiał umieścić poprawkę w specyfikacji/obsłudze, aby włączyć wywołania zwrotne after_commit podczas używania urządzeń transakcyjnych. Jeśli korzystasz z urządzeń transakcyjnych, zatwierdzenie nigdy się nie zdarza.

Łatka: https://gist.github.com/charleseff/1305285

+2

Gist jest już zapakowany jako klejnot i działa zbyt https://github.com/grosser/test_after_commit – dolzenko

Powiązane problemy