Może ktoś spotkał się z takim problemem: Railsowa appka, mailer obsługiwany przez rescque i redisa- niektore maile nie są wysyłane, losowo- nie ma błędu w resque, w logach servera również nie ma błędu- jedyne co widzę to brak renderowania treści maila w logach- i to faktycznie się powtarza w tych nie wysłanych mailach, ale nie leci żaden bład po stronie Ruby, może macie pomysł co to może być? może ktoś się spotkał z czymś podobnym Dzieki!
Znalazłam winowajcę…,odpowiem tu może komuś się przyda Do wysyłania maili z appki railsów był też używany GEM rails-observer, i tam podczas wywołania metody “after_create” miała się wysyłać notoyfikacja, ale niestety czasami rekord w bazie nie zdążył się zapisać -> a mail już chciał się wysyłać z tymże potrzebował zapisanego rekordu z bazy którego jeszcze nie było -> mail nie mial danych, nie wysłał się. (tzw race condition). Prawdopodobnie rozwiązaniem jest stosowanie metody after_commit z opcją create. (ale jak widzę gem rails observer nie ma tej opcji :().
Super, że dzielisz się swoim spostrzeżeniem (wiele osób napisałoby tylko “problem nieaktualny”)! Co do opcji opcji on :create
może ten link pomoże https://stackoverflow.com/questions/7238699/rails-3-how-to-identify-after-commit-action-in-observers-create-update-destro. Można też kombinować z zakolejkowaniem zadania z pewnym opóźnieniem (potrzebny resque-scheduler), albo w przypadku gdy zadanie w tle nie znajduje rekordu ponawiać go za jakiś czas.
Możesz spróbować rozwiązać to jeszcze inaczej - jeśli chcesz, żeby zadanie Resque było niezależne od aplikacji, o ile to możliwe możesz przekazać wszystkie niezbędne parametry do zadania i nie odczytywać niczego z bazy.
Dzięki za podpowiedzi
Wygląda na to, że taka konstrukcja sprawidzi się w opisanym przypadku:
w observer:
def after_commit(record)
if (record.send(:transaction_include_any_action?, [:create]))
end
end
Jeżeli record
to obiekt ActiveRecord
to radziłbym nie. Lepiej operować na wartościach niż obiektach (nie ma problemów z serializacją itp).