рельсы 3: как прервать способ доставки в actionmailer? - PullRequest
22 голосов
/ 01 июля 2011

В моем контроллере почтовой программы при определенных условиях (при отсутствии данных) мы прекращаем отправку электронного письма.

Как мне выйти из метода контроллера, не отображая представление в этом случае?

вернуть, если @ some_email_data.nil?

Не работает, так как представление все еще отображается (выдает ошибку каждый раз, когда я пытаюсь использовать @some_email_data, если я не добавляю много нулевых проверок)

И даже если я делаю ноль проверок, он жалуется, что нет «отправителя» (потому что я должен был «возвратиться», прежде чем добраться до строки, где я установил отправителя и тему).

Ни один не делает render ... return

По сути, ВОЗВРАТ НЕ ВОЗВРАЩАЕТСЯ внутри метода почтовой рассылки!

Ответы [ 4 ]

26 голосов
/ 07 ноября 2012

Гораздо более простым решением, чем принятый ответ, будет что-то вроде:

class SomeMailer < ActionMailer::Base
  def some_method
    if @some_email_data.nil?
      self.message.perform_deliveries = false
    else
      mail(...)  
    end  
  end
end

Если вы используете Rails 3.2.9 (или более поздние версии), вы можете условно вызвать mail(). Вот соответствующая тема GitHub . Теперь код можно переработать так:

class SomeMailer < ActionMailer::Base
  def some_method
    unless @some_email_data.nil?
      mail(...)  
    end  
  end
end
18 голосов
/ 06 июля 2011

Я только что столкнулся с тем же самым здесь.

Мое решение было следующим:

module BulletproofMailer
  class BlackholeMailMessage < Mail::Message
    def self.deliver
      false
    end
  end

  class AbortDeliveryError < StandardError
  end

  class Base < ActionMailer::Base

    def abort_delivery
      raise AbortDeliveryError
    end

    def process(*args)
      begin
        super *args
      rescue AbortDeliveryError
        self.message = BulletproofMailer::BlackholeMailMessage
      end
    end
  end
end

Использование этих упаковщиков будет выглядеть так:

class EventMailer < BulletproofMailer::Base
  include Resque::Mailer
  def event_created(event_id)
    begin
      @event = CalendarEvent.find(event_id)
    rescue ActiveRecord::RecordNotFound
      abort_delivery
    end
  end
end

Это также опубликовано в моем блоге.

0 голосов
/ 09 июля 2011

Я просто очищаю поле @to и возвращаюсь, поэтому доставляю прерывания, когда там ничего нет. (Или просто вернитесь перед установкой @to).

0 голосов
/ 01 июля 2011

Я не провел много времени с рельсами 3, но вы могли бы попробовать использовать

redirect_to some_other_route

в качестве альтернативы, если вы действительно просто проверяете отсутствующие данные, вы можете сделать jsпроверка полей формы и отправка только в том случае, если она прошла.

...