是否有一种RAILS方式来阻止邮件程序的操作/视图?

时间:2014-08-15 16:02:30

标签: ruby-on-rails email ruby-on-rails-4 actionmailer

我刚刚设置了邮件和邮件。在我的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将继续照常保留在每个邮件模板上。

1 个答案:

答案 0 :(得分:1)

我将尝试描述我目前针对邮件程序视图的解决方案。如果你有更好的想法,请告诉我。

所有示例代码都将写在haml中。 邮件的名称是MainMailer。 邮件程序的名称为confirmation

说明

  1. app/views/layouts/内为您的邮件程序创建布局模板,例如。 app/views/layouts/main_mailer.html.haml

  2. 对所有邮件程序操作共享的元素使用headerfooter等部分内容。这些部分必须放在app/views/mailer_name/目录中,例如。 app/views/main_mailer/

  3. 进一步干燥使用yield :section_name例如。 yield :top。在邮件程序操作模板中将这些已生成的部分定义为content_for :section_name do块。 (提示:不要忘记在布局基本模板中的任何位置放置yield,在其他情况下,不会显示已生成的部分)

  4. 这个解决方案的好处在于,对于新的邮件程序操作,它足以定义一个包含yield的部分文件(如app/views/main_mailer/confirmation.html.haml)。另一方面,对于新的邮件程序模型,您需要再次定义所有内容(可以在邮件程序模型中使用layout并在那里指定共享布局,但我没有对此进行测试)。 / p>

    实施例

    应用程序/视图/ main_mailer / confirmation.html.haml

    - 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_mailer.html.haml

    -# 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
    

    应用程序/视图/ main_mailer / _header.html.haml

    %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