2012-10-03 53 views
2

我正在尝试构建Rails HTML电子邮件,但每个电子邮件的结构(页眉和页脚)都是重复的。通常情况下这不是问题,但是对于内联样式,如果我想更改颜色,它似乎可能会成为问题。我怎样才能将这些元素从每个文件中分离出来?如何防止Rails HTML电子邮件中的样式重复?

而且,反正是有消除html.erb和text.erb文件之间文本的复制。

回答

8

一个简单的方法是引用几个部分。比方说,他们命名是这样的:

  • _email_header.html.erb
  • _email_footer.html.erb

然后你可以参考他们里面每个电子邮件:

<%= render :partial => 'email_header' %> 
Blah, email-specific content here... 
<%= render :partial => 'email_footer' %> 

,将工作,但仍然会导致一堆复制粘贴的,尽管少于原来的版本内联的完整结构。管理这个更简单的方法是为这些电子邮件设置一个自定义布局。

"Layout and Rendering" Rails Guide "Action Mailer" Rails Guide的布局部分对此有帮助的背景,如果您以前没有这样做过。

您将从这些参考文献中看到,有多种方法可以在Action Mailer中调用布局(还有更多方法仍然在邮件上下文之外),但要举一个示例用法,您可以在此处创建布局模板文件:app/views/layouts/{your_mailer_name}.html.erb。例如,“user_mailer.html.erb”

它的内容可能是这个样子:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
    <head> 
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> 
    <title>My Fancy Email</title> 
    </head> 
    <body> 
    <%= render :partial => 'email_header' %> 
    <%= yield %> 
    <%= render :partial => 'email_footer' %> 
    </body> 
</html> 

注意yield通话,这就是您的特定电子邮件内容将呈现。

这种方法可以使你的内容 “DRY”。

+0

做部分基本上插入代码的地方,你有<%= render ....%>? – mergesort

+1

或多或少,是的。更具体地说,“渲染”是一个Rails函数,用于加载该部分并将其呈现在该位置。 “部分”只是另一个模板的一个奇特名称,它是另一个模板中的一个片段。它们在Rails中通过向文件名预先加下划线来表示。请参阅http://guides.rubyonrails.org/layouts_and_rendering.html#using-partials – manzoid

+0

也我真的不知道这将如何工作,因为我使用动作邮件。 .html.erb文件位于views/xxx_mailer中,我在app/mailers文件夹中有.rb文件。我只是没有真正知道上面的布局文件的位置,以及如何在使用yield时获得必要的内容。感谢您的帮助顺便说一句。 – mergesort

相关问题