Рефакторинг кода в Rails 2.3 Application - PullRequest
0 голосов
/ 25 февраля 2011

У меня довольно простое приложение на Rails, которое позволяет пользователям управлять своими клиентами и создавать кейс для каждого клиента. Когда дело создается, детали отправляются на два адреса электронной почты (различное содержимое в каждом письме) и, используя драгоценный камень, отправляют информацию на FreeagentCentral.

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

В настоящее время у меня есть следующий код в моем приложении Rails 2.3.

kases_controller.rb

# POST /kases
# POST /kases.xml
  def create
    @company = Company.find(params[:kase][:company_id])
    @kase = @company.kases.new(params[:kase])

    if @kase.save
        UserMailer.deliver_makeakase("dropbox@1223111.domain.highrisehq.com", "Highrise", @kase) if params[:sendtohighrise]
        UserMailer.deliver_makeakaseteam("surveymanager@domain.co.uk", "Highrise", @kase) if params[:notify_team_of_creation]
        @kase.delay.create_freeagent_project(current_user) if params[:send_to_freeagent]

        redirect_to(@kase)

        #flash[:notice] = 'Case was successfully created.'
        flash[:notice] = fading_flash_message("Case was successfully created.", 5)
      else
        render :new
      end        
  end

user_mailer.rb

def makeakase(email, name, kase, bccemails = [])
      recipients email
      from "info@domain.co.uk"
      subject "FW: Case creation from Survey Manager"
      bcc bccemails
      sent_on Time.now
      body :name => name, :kase => kase
  end

  def makeakaseteam(email, name, kase = [])
      recipients email
      from "info@domain.co.uk"
      subject "A new case has been created."
      sent_on Time.now
      body :name => name, :kase => kase
      content_type "text/html"
  end

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

Я использую PostmarkApp для отправки электронных писем, что является еще одним драгоценным камнем. Подробности о которых можно найти здесь: postmark-gem

Ответы [ 3 ]

1 голос
/ 25 февраля 2011

Не уверен, что это то, что вам нужно, но я бы сделал метод, который бы выполнял отправку электронных писем и создание свободного агента, а затем позволял бы обрабатывать delayed_job.

Что-то вроде

class Kase

  def send_emails(current_user, send_to_highrise, notify_team, send_to_freeagent)
    UserMailer.deliver_makeakase("dropbox@1223111.domain.highrisehq.com", "Highrise", self) if send_to_highrise
    UserMailer.deliver_makeakaseteam("surveymanager@domain.co.uk", "Highrise", self) if notify_team
    self.create_freeagent_project(current_user) if send_to_freeagent
  end
end

и в вашем контроллере вы могли бы написать

if @kase.save
  @kase.delay.send_emails(current_user, params[:sendtohighrise], 
                         params[:notify_team_of_creation], params[:send_to_freeagent])
  redirect_to @kase
  flash[:notice] = fading_flash_message("Case was successfully created.", 5)
else
  ...

или просто передать params, возможно, проще / чище.

0 голосов
/ 25 февраля 2011

С установленным delayed_job для более старых версий вы можете просто сделать следующее:

UserMailer.send_later(:deliver_makeakase, "dropbox@1223111.domain.highrisehq.com", "Highrise", @kase) if params[:sendtohighrise]
UserMailer.send_later(:deliver_makeakaseteam, "surveymanager@domain.co.uk", "Highrise", @kase) if params[:notify_team_of_creation]

Для версии, начинающейся с 2.0.4, синтаксис немного отличается.

UserMailer.delay.deliver_makeakase("dropbox@1223111.domain.highrisehq.com", "Highrise", @kase) if params[:sendtohighrise]
UserMailer.delay.deliver_makeakaseteam("surveymanager@domain.co.uk", "Highrise", @kase) if params[:notify_team_of_creation]
0 голосов
/ 25 февраля 2011

Я успешно использовал Старлинг и Уорлинг для аналогичной проблемы.Я не уверен, что это более низкие издержки, поскольку я лично еще никогда не использовал delayed_job.Вы можете изучить это.

...