5

Bunun bir parçası, bileşenle birlikte küçük bir şablon kodunun kesilmesini sağlamak için ne kadar uygun bir tepki verdiğinden geliyor. Ben bütün e-postalar için bu düzeni kullanıyorumBir mailer şablonunu .rb dosyasında nasıl oluştururum (şablon dosyası yok)

# app/mailers/membership_mailer.rb 
# frozen_string_literal: true 
class MembershipMailer < ApplicationMailer 
    def one_week_expiration(member, renewal, org) 
    template = slim(%(
     = content_for :header 
     = org.name 
     Hello, #{member.name}, 
     br 
     Your membership for #{org.name} is set to expire at 
     #{renewal.expires_at.to_s(:short)}. 
     br 
     Please visit <a href=#{org.url}>#{org.url}</a> to purchase 
     a membership renewal. 
     br 
     br 
    )) 

    subject = "Your membership for #{org.name} is going to expire soon" 
    mail(to: member.email, subject: subject) do |format| 
     # there isn't a slim renderer 
     format.html { render text: template } 
    end 
    end 
end 

ve varsayılan düzeni application_mailer şeklinde ayarlanır: İşte ben bugüne kadar ne var.

# app/views/layouts/email.html.slim 
= stylesheet_link_tag "email" 

header 
    .shell 
    h1 = yield :header 

.shell 
    br 
    = yield :body 
    = yield 

= render partial: "/shared/email_footer" 

Burada tüm render yöntemlerini istiyorum, ama ne ile mücadele ediyorum/bulmak postasının, düzen için şablon oluşturmaktır anlamaya ve bütün istediğim değişkenleri olması nerede erişilebilir şablonlara geçti.

# app/mailers/application_mailer.rb 
# frozen_string_literal: true 
class ApplicationMailer < ActionMailer::Base 
    default from: APPLICATION_CONFIG['support_email'] 
    layout 'email' 

    # taken from slim/test/block rendering/helper 
    def slim(source, options = {}, &block) 
    scope = options.delete(:scope) 
    locals = options.delete(:locals) 
    Slim::Template.new('', {}) { source }.render(scope, locals, &block) 
    end 
end 

Sonunda, {...} vb erb, arbre,

Yani, özetle, ben posta (...) için arama yapmak gerekecek, Bence Şablonumda bir şablon dosyasında değil, yakutta tanımlanmış olması gibi bir şeyden dolayı, mailer ve şablonun birbirinden çok uzak olmasını istemiyorum (dosya sisteminde .. neden bu sorunun kapsamı dışındadır? sadece şimdilik ruby'de oluşturma problemini çözmek istiyorum).

cevap

0

render_anywhere'u kullanmanın en kolay yolu, yalnızca çok azaltılmış bir denetleyici yapar ve bu da bize render yöntemine erişmemizi sağlar. Benim postasının

def one_week_expiration(member, renewal, org) 
    template_environment = { 
     org: org, 
     member: member, 
     renewal: renewal 
    } 

    template = slim(env: template_environment) do 
     %q(
     = content_for :header 
      = org.name 

     h3 Hello, #{member.name}, 

     | Your membership for #{org.name} is set to expire at #{renewal.expires_at.to_s(:short)}. 
     br 
     | Please visit <a href=#{org.url}>#{org.url}</a> to purchase a membership renewal. 
     br 
     br 
    ) 
    end 

    subject = "Your membership for #{org.name} is going to expire soon" 

    mail(to: member.email, subject: subject) do |format| 
     format.html { render text: template } 
    end 
    end 

yılında

Ve (application_mailer olarak) sonra önemli bit

require 'render_anywhere' 

class ApplicationMailer < ActionMailer::Base 
    layout 'email' 

    default from: APPLICATION_CONFIG['support_email'] 



def slim(env: {}) 
    raise 'No Block Given' unless block_given? 

    RenderAnywhere::RenderingController.new.render_to_string(
     inline: yield, layout: 'email', type: :slim, locals: env 
    ) 
    end 
end 

Ve işte bu kadar:

Yani, benim sınıflarına Değişikliklerim aşağıdaki gibidir.