簡體   English   中英

Rails動作郵件如果聲明

[英]Rails action mailer if statements

我試圖把一些邏輯放進我的郵件程序中。 基本上,我在我的一個模型中有十幾個布爾字段,對於每個真實的字段,我希望將電子郵件發送到特定地址。 具有布爾字段的模型稱為Ecn。 這是我的通知文件:

class EcnNotifier < ActionMailer::Base
  default from: "engineering_notices@wilfley.com"

  def submitted(ecn)
    @ecn = ecn
    @email_list = EmailList.all
    if @ecn.distribute_engineering?  
        mail to: "abc@gmail.com", subject: 'ECN approvald' 
    else

    end
    if @ecn.distribute_purchasing? 
        mail to: "123@gmail.com", subject: 'ECN approval' 
    else

    end
    mail to: "aaa@test.com", subject: 'ECN approval'
  end
end

我在控制器中創建的動作如下所示:

  def submit

    @ecn = Ecn.find(params[:id])

    respond_to do |format|
      EcnNotifier.submitted(@ecn).deliver
      format.html { redirect_to ecns_url, alert: "Ecn has been submitted for approval." }
      format.json { render json: @ecns }
    end
  end

電子郵件會自動發送到aaa@test.com,但無論distribute_engineering和distribute_purchasing是否為true,都不會向其他地址發送電子郵件。 我假設我錯誤地訪問了我的對象實例,但我不確定我哪里出錯了。

您只能發送一個郵件與一個呼叫deliver 您必須將您的邏輯移到郵件程序之外,或使用cc或bcc將郵件傳遞給多個收件人。

我以為你只能在一個郵件程序中發送一封郵件,而不是多封郵件。 您可以發送一封郵件並添加幾個cc或密件抄送,但只能在一個操作范圍內發送一封郵件。

我會將控制器更改為以下內容:

def submit
  @ecn = Ecn.find(params[:id])

  respond_to do |format|
    EcnNotifier.notify_default(@ecn).deliver
    EcnNotifier.distribute_engineering(@ecn).delifer if @ecn.distribute_engineering?
    EcnNotifier.distribute_purchasing(@ecn).deliver if @ecn.distribute_purchasing?
    # and so on...
    format.html { redirect_to ecns_url, alert: "Ecn has been submitted for approval." }
    format.json { render json: @ecns }
  end
end

和你的EcnNotifier郵件:

class EcnNotifier < ActionMailer::Base
  default from: "engineering_notices@wilfley.com"

  def notify_default(ecn)
    @ecn = ecn
    @email_list = EmailList.all
    mail to: "aaa@test.com", subject: 'ECN approval'
  end

  def distribute_engineering(ecn)
    @ecn = ecn
    @email_list = EmailList.all
    mail to: "abc@gmail.com", subject: 'ECN approval' 
  end

  def distribute_purchasing(ecn)
    @ecn = ecn
    @email_list = EmailList.all
    mail to: "abc@gmail.com", subject: 'ECN approval' 
  end

end

順便說一句:如果你發送多封郵件,你應該通過延遲工作寶石或類似的東西來做到這一點。 否則用戶必須等待很長時間,因為在發送所有郵件期間將阻止ruby進程。 延遲的job gem可以在github上找到: https//github.com/collectiveidea/delayed_job

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM