Лучший способ послать электронное письмо после создания нового образцового экземпляра в направляющих?

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

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

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

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

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

7
задан jakeboxer 30 January 2010 в 19:16
поделиться

3 ответа

Вот небольшой сценарий крючков, который делает то, что вы хотите: Необходимо настроить 2 вещи:

  • незаконные _ суффиксы : список python со всеми суффиксами, которые должны прервать фиксацию
  • cmdSVNLOOK : путь к программе svnlook

import sys
import subprocess 
import re

#this is a list of illegal suffixes:
illegal_suffixes = ['.exe','.dll']

# Path to svnlook command:
cmdSVNLOOK="/usr/bin/svnlook";

def isIllegalSuffix(progname):
    for suffix in illegal_suffixes:
        if (ptFilename.endswith(suffix)):
            return True
    return False

######### main program ################
repopath = sys.argv[1]
transact = sys.argv[2]

retVal = 0
svninfo = subprocess.Popen([cmdSVNLOOK, 'changed', '-t', transact, repopath], 
                                                        stdout = subprocess.PIPE, stderr=subprocess.PIPE)
(stdout, stderr) = svninfo.communicate();

prog = re.compile('(^[ACUDRM_])[ACUDRM]*\s+(.+)')  # regex for svnlook output
for line in stdout.split("\n"):
    if (line.strip()!=""):
        match=re.search(prog, line.strip())
        if match:
            mode = match.group(1) 
            ptFilename = match.group(2)
            if mode == 'A' and isIllegalSuffix(ptFilename): 
              retVal = 1
              sys.stderr.write("Please do not add the following ")
              sys.stderr.write("filetypes to repository:\n")
              sys.stderr.write(str(illegal_suffixes)+"\n")
              break
        else:
            sys.stderr.write("svnlook output parsing failed!\n")
            retVal = 1
            break
    else:
        # an empty line is fine!
        retVal = 0
sys.exit(retVal)
-121--2695341-

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

Слышали ли вы о acts_as_state_machine или каких-либо других подобных решениях?

http://github.com/rubyist/aasm

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

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

-121--4043441-

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

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

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

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

3
ответ дан 7 December 2019 в 14:32
поделиться

Роман прав, но обратите внимание, что столбец auto_increment должен быть частью ПЕРВИЧНОГО КЛЮЧА или УНИКАЛЬНОГО КЛЮЧА (и почти в 100% случаев он должен быть единственным столбцом, составляющим ПЕРВИЧНЫЙ КЛЮЧ):

ALTER TABLE document MODIFY document_id INT AUTO_INCREMENT PRIMARY KEY
-121--633230-

Прежде всего, распечатайте документацию о «безопасных/небезопасных» функциях от ms

fopen

Так же безопасно, как и fopen_s... Uless вы идиот и предполагаете, что возвращенный указатель не является NULL, или предоставьте NULL в качестве входного параметра.

vfprintf vsprintf sprintf 

Только MS не поддерживает C99, используйте семейство snprintf .

 strncpy

Абсолютно безопасно, если вы прочитали руководство

strcpy strcat

Используйте strncpy и strncat и прочтите спецификации. (т.е. strncpy не может быть прерван null)

Так... Еще раз:

Распечатайте документацию о «безопасных/небезопасных» функциях от MSDN и сожгите ее!

-121--2881567-

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

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

1
ответ дан 7 December 2019 в 14:32
поделиться

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

Слышали ли вы о act_as_state_machine или о других подобных решениях?

http://github.com/rubyist/aasm

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

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

0
ответ дан 7 December 2019 в 14:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: