2010-01-30 8 views
7

Mam app z następujących modeli: User, Task i Assignment. Każde Przypisanie belongs_to Użytkownika i Zadanie (lub innymi słowy, Zadanie jest przypisane do Użytkownika poprzez Przypisanie).Najlepszy sposób na wysłanie wiadomości e-mail po utworzeniu nowej instancji modelu w Railsach?

Gdy użytkownik zakończy zadanie, zadanie zostanie oznaczone jako ukończone, a aplikacja natychmiast utworzy nowe zadanie (lub innymi słowy, przydzieli zadanie innej osobie).

Natychmiast po utworzeniu tego nowego zadania, Chcę wysłać e-mail do nowego cesjonariusza. Wiem, że mogę to zrobić na jeden z trzech sposobów:

  1. Jawnie wyślij wiadomość e-mail w moim kontrolerze.
  2. Wyślij wiadomość e-mail w oddzwonieniu w modelu Przyporządkowanie.
  3. Utwórz obserwatora w modelu Przyporządkowanie i wyślij wiadomość e-mail pod numerem after_create.

Które z tych opcji uważają za najlepsze i dlaczego? Wygląda na to, że # 1 jest zły, ponieważ nie chcę pamiętać o wysłaniu go w każdej akcji, która może zakończyć zadanie. Słyszałem, jak kilka osób mówi, że obserwatorzy Railsów są źli i powinni ich unikać, ale nie jestem pewien, czy to ludzie, którym powinienem zaufać, czy nie. Jakieś inne opinie?

Odpowiedz

3

Masz rację, pierwszy sposób nie jest dobrym podejściem. Obserwatorzy to moja ulubiona metoda, z kilku powodów.

Po pierwsze, jeśli używasz TDD (Test-Driven Development) można wyłączyć obserwatorów bardziej czysto przetestować model bez każdym stworzeniu wystrzelenie do tworzenia przesyłkę. Następnie możesz osobno przetestować odbiorcę i obserwatora.

Po drugie, idea oddzielania wywołań zwrotnych tworzy czystszy kod. Połączenia zwrotne nie są częścią twojego modelu, są wydarzeniami. Twój model zawiera funkcje i atrybuty niezbędne do działania samego siebie, a wywołania zwrotne (zaimplementowane z obserwatorami) są osobnymi procedurami obsługi zdarzeń.

To powiedziawszy, nie sądzę, twoja druga opcja jest „zły” lub mniej profesjonalnie.Tak czy inaczej działa tak długo, jak na poziomie modelu, zamiast kontrolerów lub (nawet gorszych) widoków.

+0

Program TDD to fantastyczny powód, aby korzystać z obserwatorów. O ile ktoś nie będzie bardziej przekonujący, wkrótce cię sprawdzę. – jakeboxer

1

pójdę do obserwatorów, jak zmniejszyć bałagan w swoim modelu/kodu kontrolera i mogę myśleć bez spowolnienia w ich użyciem ...

IIRC wysyłając e-mail po zapisać e-mail jest nawet przykład w aktywnym dokumentacja rekordów obserwatorów

+0

Tak widziałem to, i to jest jeden z powodów, spytałem. Jednak kilka osób powiedziało mi, żebym unikał obserwatorów, więc chciałem zdobyć jeszcze kilka opinii. – jakeboxer

+0

jeśli są jakieś problemy z obserwatorami, też byłbym zainteresowany! – roman

+0

Powodem, dla którego podali, było to, że nic bezpośrednio nie odnosi się do obserwatorów, więc nowi ludzie patrzący na kod mogą ich nie zauważyć. Wydaje mi się, że jest to dla mnie raczej słaby powód i bardziej wskazujący na dziurę w wiedzy Railsowej dewelopera niż na zły zapach kodu, ale nadal chcę usłyszeć opinie bardziej doświadczonych ode mnie osób. – jakeboxer

0

Możesz także wykonać kombinację rzeczy. Możesz użyć obserwatorów do jednej akcji, a jeśli jest tylko jeden e-mail dla jednego działania, możesz użyć opcji nr 1.

Słyszałeś o acts_as_state_machine lub jakichkolwiek innych podobnych rozwiązań?

http://github.com/rubyist/aasm

one pozwalają określić stan poszczególnych obiektów i innych rzeczy, które mogą się zdarzyć ze zmianami państwowych.

To pozwala mieć tyle logiki, jak trzeba o tym, kiedy rzeczy są wysyłane, jeśli trzeba to dużo. Może być przesadą, ale może być naprawdę przydatny. Proponuję, ponieważ chcesz, aby wiadomość e-mail była wysyłana, gdy zadanie zostało "ukończone", co brzmi, jakby to był rodzaj kolumny stanu lub stanu w Twoim modelu zadania.

+0

To wygląda świetnie, a na pewno będę o tym pamiętać. Na razie jednak jest to zdecydowanie przesada. W każdym razie dzięki. – jakeboxer

Powiązane problemy