我刚刚设置了邮件和邮件。在我的rails应用程序上与HAML gem一起操作/视图。我也使用了mailgun提供的transactional email templates。 HAML中的典型邮件模板如下所示:
!!!
%html{xmlns: "http://www.w3.org/1999/xhtml"}
%head
%meta{content: "width=device-width", name: "viewport"}/
%meta{content: "text/html; charset=UTF-8", "http-equiv" => "Content-Type"}/
%title Alerts e.g. approaching your limit
%link{href: "styles.css", media: "all", rel: "stylesheet", type: "text/css"}/
%body
%table.body-wrap
%tr
%td
%td.container{width: "600"}
.content
%table.main{cellpadding: "0", cellspacing: "0", width: "100%"}
%tr
%td.alert.alert-warning
Warning: You're approaching your limit. Please upgrade.
%tr
%td.content-wrap
%table{cellpadding: "0", cellspacing: "0", width: "100%"}
%tr
%td.content-block
You have
%strong 1 free report
remaining.
%tr
%td.content-block
Add your credit card now to upgrade your account to a premium plan to ensure you don't miss out on any reports.
%tr
%td.content-block
%a.btn-primary{href: "http://www.mailgun.com"} Upgrade my account
%tr
%td.content-block
Thanks for choosing Acme Inc.
.footer
%table{width: "100%"}
%tr
%td.aligncenter.content-block
%a{href: "http://www.mailgun.com"} Unsubscribe
from these alerts.
%td
正如你所看到的那样,%html,%head,%tables,%tr,%td等代码将重复出现在我每个邮件模板上拥有我的应用程序(电子邮件确认,password_reset,other_notifications,weekly_digests等)。
我的问题:是否有一种很好的RAILS方法可以将所有模板代码干涸为:
!!!
= render :partial => 'widgets/mail/head'
%body
= render :partial => "widgets/mail/header" # <Mail header>
= yield_mail_content # <Main tag for content>
= render :partial => "widgets/mail/footer" # <Mail footer>
或更好,请将registration_confirmation.html.haml写成如下:
= render :partial => 'widgets/mail/html_above'
= render <!-- registration_mail_specific_content_here -->
= render :partial => 'widgets/mail/html_below'
编辑:有部分可行,但仍需要维护%表,%tr,%td等的HAML嵌套。像这样:
.content
%table.main{cellpadding: "0", cellspacing: "0", width: "100%"}
= render :partial => 'widgets/mail/header'
%tr
%td.content-wrap
%table{cellpadding: "0", cellspacing: "0", width: "100%"}
%tr
%td.content-block
Hi
= succeed ',' do
= @user.first_name.capitalize
这通常意味着%table,%tr,%td将继续照常保留在每个邮件模板上。
答案 0 :(得分:1)
我将尝试描述我目前针对邮件程序视图的解决方案。如果你有更好的想法,请告诉我。
所有示例代码都将写在haml
中。
邮件的名称是MainMailer
。
邮件程序的名称为confirmation
。
在app/views/layouts/
内为您的邮件程序创建布局模板,例如。 app/views/layouts/main_mailer.html.haml
对所有邮件程序操作共享的元素使用header
,footer
等部分内容。这些部分必须放在app/views/mailer_name/
目录中,例如。 app/views/main_mailer/
进一步干燥使用yield :section_name
例如。 yield :top
。在邮件程序操作模板中将这些已生成的部分定义为content_for :section_name do
块。 (提示:不要忘记在布局基本模板中的任何位置放置yield
,在其他情况下,不会显示已生成的部分)
这个解决方案的好处在于,对于新的邮件程序操作,它足以定义一个包含yield的部分文件(如app/views/main_mailer/confirmation.html.haml
)。另一方面,对于新的邮件程序模型,您需要再次定义所有内容(可以在邮件程序模型中使用layout
并在那里指定共享布局,但我没有对此进行测试)。 / p>
- content_for :top do
%h1 Some top section text
- content_for :content do
%p.lead Mail content text
%p More of the mail content
-# Main template for all e-mails (like application.html.haml is for views)
!!!
%html{:xmlns => "http://www.w3.org/1999/xhtml"}
%head
%meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}/
%meta{:content => "width=device-width", :name => "viewport"}/
= stylesheet_link_tag 'email', media: 'all'
%body
%table.body
%tbody
%tr
%td.center{:align => "center", :valign => "top"}
%center
= render 'header'
-# anywhere use yield in order to use yield :sth blocks
= yield
%table.container
%tbody
%tr
%td
%table.row
%tbody
%tr
%td.wrapper.last
%table.twelve.columns
%tbody
%tr
%td= yield :top
%td.expander
%table.row
%tbody
%tr
%td.wrapper.last
%table.twelve.columns
%tbody
%tr
%td
%br
= yield :content
%td.expander
%table.row.header
%tbody
%tr
%td.center{:align => "center"}
%center
%table.container
%tbody
%tr
%td.wrapper.last
%table.twelve.columns
%tbody
%tr
%td.six.sub-columns.title-area
%h4= link_to @user.service.name, root_url
%td.six.sub-columns.last{:style => "text-align:right; vertical-align:middle;"}
%td.expander