Rails:电子邮件“deliver_”方法的自定义模板?

Posted

技术标签:

【中文标题】Rails:电子邮件“deliver_”方法的自定义模板?【英文标题】:Rails: Custom template for email "deliver_" method? 【发布时间】:2010-06-16 15:16:03 【问题描述】:

我正在构建一个电子邮件系统,将我的不同电子邮件存储在数据库中,并通过method_missing 调用适当的“deliver_”方法(因为我无法明确声明方法,因为它们是用户生成的)。

我的问题是我的 rails 应用程序仍然尝试为生成的电子邮件呈现模板,尽管这些模板不存在。我想强制所有电子邮件使用相同的模板 (views/test_email.html.haml),该模板将被设置为从我的数据库记录中提取它们的格式。

我怎样才能做到这一点?我尝试在emailer_controllertest_email 方法中添加render :template => 'test_email',但没有成功。


models/emailer.rb:

class Emailer < ActionMailer::Base

  def method_missing(method, *args)
    # not been implemented yet
    logger.info "method missing was called!!"
  end

end

controller/emailer_controller.rb:

class EmailerController < ApplicationController

  def test_email
    @email = Email.find(params[:id])
    Emailer.send("deliver_#@email.name")
  end

end

views/emails/index.html.haml:

%h1 Listing emails
%table :cellspacing => 0 
  %tr
    %th Name
    %th Subject
  - @emails.each do |email| 
    %tr
      %td=h email.name
      %td=h email.subject
      %td= link_to 'Show', email
      %td= link_to 'Edit', edit_email_path(email)
      %td= link_to 'Send Test Message', :controller => 'emailer', :action => 'test_email', :params =>  :id => email.id 
      %td= link_to 'Destroy', email, :confirm => 'Are you sure?', :method => :delete
%p= link_to 'New email', new_email_path

我在上面遇到的错误:

模板丢失

缺少模板 emailer/name_of_email_in_database.erb 在视图中 路径应用程序/视图

【问题讨论】:

【参考方案1】:

尝试多部分可能会起作用

  def test_email
    @email = Email.find(params[:id])
    Emailer.send("deliver_#@email.name")
    part :content_type => 'multipart/alternative' do |copy|
      copy.part :content_type => 'text/plain' do |plain|
        plain.body = render( :file => "conta.text.plain.erb",  :email=>@email )
      end
      copy.part :content_type => 'text/html' do |html|
        html.body = render( :file => "conta.text.html.erb",  :email => @email )
      end
    end
  end

【讨论】:

【参考方案2】:

Aph,我觉得很傻。我想通了:

models/emailer.rb:

class Emailer < ActionMailer::Base

  def method_missing(method, *args)
    logger.info "method missing was called!!"
    recipients  "Test <test@test.com>" 
    body        "# Email.find_by_name(method.to_s).body "
  end

end

由于传入的method 基本上是记录的名称,我可以直接提取存储在数据库中的正文内容并将其作为电子邮件的正文传递,完全绕过模板。

【讨论】:

【参考方案3】:

我会去“上一个层次”

换句话说,对每个人的电子邮件使用相同的视图。但是在视图中,根据 user_id 渲染不同的文本。

记住视图可以调用渲染方法。

就我而言,我让用户使用流动模板系统上传电子邮件模板。 (Google for rails 液体模板。)使用液体很好,因为它是安全的——用户不能在他们的模板中包含任意的 ruby​​ 代码。

然后我的电子邮件视图呈现液体模板并由此生成自定义电子邮件。

【讨论】:

以上是关于Rails:电子邮件“deliver_”方法的自定义模板?的主要内容,如果未能解决你的问题,请参考以下文章

在 Rails 3.1 中为 Mailer 和 View 提供自定义助手

使用 Rails 将图像嵌入电子邮件的正确方法是啥?

使用 Postmarkapp 在 Rails 应用程序中处理电子邮件异常的最佳方法是啥?

在 Rails 中验证多封电子邮件和处理错误的最佳方法是啥?

Laravel 5.5 自定义重置密码抛出令牌不匹配

如何在 Rails 中预览电子邮件?