Лучший способ отправить электронное письмо при создании экземпляра новой модели в Rails? - PullRequest
7 голосов
/ 30 января 2010

У меня есть приложение со следующими моделями: User, Task и Assignment. Каждое Назначение belongs_to Пользователь и Задача (или, другими словами, Задача назначается Пользователю посредством Назначения).

Как только пользователь завершает задачу, назначение помечается как выполненное, и приложение немедленно создает новое назначение (или, другими словами, назначает задачу кому-то еще).

Сразу после создания этого нового Назначения я хочу отправить электронное письмо новому уполномоченному. Я знаю, что могу сделать это одним из трех способов:

  1. Явно отправьте письмо на мой контроллер.
  2. Отправьте электронное письмо в обратном вызове для модели Назначения.
  3. Создайте наблюдателя в модели Назначения и отправьте электронное письмо по адресу after_create.

Какой из этих вариантов люди считают лучшим и почему? № 1 кажется мне плохим, потому что я не хочу помнить, чтобы отправлять его при каждом действии, которое может выполнить задание. Я слышал, как пара людей сказала, что наблюдатели на Rails плохие люди, которых следует избегать, но я не уверен, стоит ли им доверять людям или нет. Есть другие мнения?

Ответы [ 4 ]

3 голосов
/ 30 января 2010

Вы правы, первый путь не очень хороший подход. Наблюдатели - мой любимый путь, по нескольким причинам.

Во-первых, если вы используете TDD (разработку через тестирование), вы можете отключить наблюдателей, чтобы более просто протестировать модель, не создавая при этом каждое создание, созданное отправителем. Затем вы можете по отдельности протестировать почтовую программу и наблюдателя.

Во-вторых, идея разделения обратных вызовов создает более чистый код. Обратные вызовы на самом деле не являются частью вашей модели, они являются событиями. Ваша модель содержит функции и атрибуты, необходимые для ее запуска, а обратные вызовы (реализованные с помощью наблюдателей) являются отдельными обработчиками событий.

Тем не менее, я не думаю, что ваш второй вариант "плохой" или менее профессиональный. Любой способ работает, пока он находится на уровне модели, вместо контроллеров или (что еще хуже) представлений.

1 голос
/ 30 января 2010

Я бы пошел за наблюдателями, так как они уменьшают беспорядок в коде вашей модели / контроллера, и я не могу думать о недостатках в их использовании ...

iirc, отправляющий электронное письмо после сохранения электронной почты, является даже примером в документации активных наблюдателей записи

0 голосов
/ 14 сентября 2011

В конце концов, мне нравится эта реализация http://www.scottw.com/resque-mail-queue-gem

0 голосов
/ 30 января 2010

Вы также можете сделать комбинацию вещей. Вы можете использовать наблюдателей для одного действия, и если для одного другого действия есть только одно электронное письмо, вы можете использовать для него опцию №1.

Вы слышали оcts_as_state_machine или других подобных решениях?

http://github.com/rubyist/aasm

Они позволяют вам определять состояние каждого объекта и различные вещи, которые могут произойти с изменениями состояния.

Это позволяет вам иметь столько логики, сколько вам нужно, когда отправляются вещи, если вам это нужно. Может быть излишним, но может быть очень удобным. Я предлагаю, потому что вы хотите, чтобы электронное письмо отправлялось, когда задача «выполнена», и похоже, что это может быть тип столбца состояния или состояния в вашей модели задачи.

...