Rails Action Mailer не показывает тело с макетом - PullRequest
0 голосов
/ 17 июня 2020

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

class Application < ActionMailer::Base
    layout 'mailer'
end

У меня есть файл mailer.html.erb в app/views/layouts и mailer.text.erb в том же месте.

mailer. html .erb:

<!DOCTYPE HTML>
<HTML lang="en">
<head>
</head>
<body>
    <%= yield %>
    <hr>
    <footer>
        Message sent from "xxx"
    </footer>
</html>

Это хорошо работает с нашим PasswordMailer:

class PasswordMailer < ApplicationMailer
    def password_changed(user)
        @user = user
        mail(:to => user.email, :subject => t('mailer.email_topic_password_changed'))
    end
end

Но этот макет не работает с моим другим почтовым ящиком:

class SystemImportMailer < ApplicationMailer
  def notify_email(params)
    mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}"
         body: params[:body])
  end
end

Эта почтовая программа просто показывает тело как обычно, без включения сообщения в макет. Если я удалю строку body: params[:body]), появится сообщение макета. Я не уверен, почему это так.

Спасибо

РЕДАКТИРОВАТЬ: У меня также есть этот почтовый клиент, использующий другую технику добавления тела.

class ScheduleMailer < ApplicationMailer
  def send_start_email(params)
    mail(to: params[:to], subject: I18n.t('schedule.start_subject')) do |format|
      format.text do
        render :text => I18n.t('schedule.start_message', type: params[:type], key: params[:key], company: params[:company]
      end
    end
  end
end

1 Ответ

1 голос
/ 17 июня 2020

Да, это не сработает. Когда вы говорите:

mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}"
         body: params[:body])

Параметр body заменит весь ваш шаблон макета mailer, и, таким образом, в вашем электронном письме будет только params[:body] содержимое. Если вы не передадите параметр body (например, password_mailer), он проверит наличие представлений в папке app/views/password почтовой программы и отобразит это представление на электронную почту.

Поэтому вместо использования параметра body на mail, вы можете создать переменную экземпляра и получить доступ к ней внутри файла notify_email.html.erb или notify_email.text.erb.

Итак, в вашем файле почтовой программы:

class SystemImportMailer < ApplicationMailer
  def notify_email(params)
    # create this variable
    @body_content = params[:body]
    mail(to: params[:email],
         subject: "#{t('admin.import_export.import_file')}")
  end
end

Затем в вашем notify_email.html.erb или notify_email.text.erb:

<p><%= @body_content %></p>

РЕДАКТИРОВАТЬ: Вы не упомянули свой вариант использования, но все же ваши усложняющие вещи, когда рельсы упрощают это.

  1. Если вы хотите использовать экземпляр var только для text версии почты, вы можете создать @text_only_body = params[:body], а затем включить этот @text_only_body в свой send_start_email.text.erb. Не включайте его в свой файл .html.erb Пример:

    # Mailer
    def send_start_email(params)
      @text_only_body = params[:body]
      mail(to: params[:to], subject: I18n.t('schedule.start_subject'))
    end
    
    # send_start_email.text.erb
    Hello, <%= text_only_body %>
    
  2. Если вы хотите отправлять только текстовые сообщения электронной почты, вы не хотите отправлять HTML электронные письма, затем сделайте что-нибудь это:

    def send_start_email(params)
      @text_only_body = params[:body]
      mail(to: params[:to], subject: I18n.t('schedule.start_subject')) do |format|
        format.text
      end
    end
    
...