5

これは、反応がどのようにして、コンポーネントに小さなテンプレートコードを挿入するのが便利になったのかから来ています。ここに私がこれまで持っていたものがあります:.rbファイル内にメーラーテンプレートをレンダリングするには(テンプレートファイルなし)

# 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 

私はすべての私の電子メールにこのレイアウトを使用しており、デフォルトのレイアウトapplication_mailerとして設定されています。

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

は、私はここですべてのレンダリング方法をしたいが、私はに苦しんだことは/見つけるメーラー、レイアウトのテンプレートを構築する方法を見つけ出す、と私はしたいすべての変数を持っているところでありますテンプレートに渡すことができます。

# 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 

結局、私は{...}などERB、ARBRE、

ので、要約すると、私はメール(...)への呼び出しを行う必要があります、私は思います私はテンプレートファイルではなく、ルビーで定義された私のテンプレートを持つことができるようになりました。なぜなら私はメーラーとテンプレートをあまり離れているからです(ファイルシステムで..なぜこの質問の範囲外です。今はルビのレンダリングの問題を解決したいだけです)。

答えて

0

最も簡単な方法は、render_anywhereを使用することです。このコントローラは非常に細かいコントローラを作成し、renderメソッドにアクセスします。

だから、次のように私のクラスへの私の変更点は次のとおりです。私のメーラーで

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 

そして(application_mailerで)重要なビット

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 

そして、それはそれです。

関連する問題