Рендеринг шаблонов рассылок с помощью Mustache в Rails

Я пытаюсь перенести свои шаблоны электронной почты Rails на усы, используя жемчужину усов.

У меня есть стандартное действие почтовой программы, которое просто отправляет электронное письмо пользователю. Я переименовал свой путь к шаблону, чтобы предотвратить конфликт имен при создании класса представления тайника для шаблона, связанного с этим действием почтовой программы. Этот процесс описан в руководствах по Rails.

# app/mailers/registration_mailer.rb
class RegistrationMailer < ActionMailer::Base
  def bailed(user)
    @user = user
    mail to: user.email, template_path: 'er_registration_mailer'
  end
end

Это представление Stache, связанное с описанным выше действием. Обратите внимание, что имя модуля соответствует указанному выше пути к шаблону.

# app/views/er_registration_mailer/bailed.rb
module ErRegistrationMailer
  class Bailed < ::Stache::Mustache::View
    def continue_registration_link
      link_to "Continue registration by connecting your Twitter account", 
        connect_registrations_url
    end

    def signature
      @view.render "shared/mailer/sig"
    end
  end
end

Наконец-то у меня есть шаблон усов для моей почтовой программы.

# app/templates/er_registration_mailer/bailed.html.mustache
<p>Hi there!</p>

<p>I noticed you recently started the signup process for my app but didn't complete it.</p>

<p>{{{continue_registration_link}}}</p>

{{{signature}}}

Когда я пытаюсь отправить электронное письмо, я получаю сообщение об ошибке при попытке отобразить партиал signature. Этот партиал живет в app/templates/shared/mailer, где у меня есть версии с усами и erb, которые называются _sig.html.mustache и _sig.html.erb соответственно.

Вот ошибка:

Failure/Error: RegistrationMailer.bailed(user).deliver
  ActionView::Template::Error:
    Missing partial shared/mailer/sig with {:locale=>[:en], :formats=>[:html, :text, :js, :css, :ics, :csv, :png, :jpeg, :gif, :bmp, :tiff, :mpeg, :xml, :rss, :atom, :yaml, :multipart_form, :url_encoded_form, :json, :pdf, :zip], :handlers=>[:erb, :builder, :raw, :ruby, :jbuilder, :coffee, :slim, :arb, :rb, :mustache]}. Searched in:
      * "/Users/davidtuite/dev/shareshaper/app/app/views"
      * "/Users/davidtuite/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/bundler/gems/active_admin-6f04ed5cec24/app/views"
      * "/Users/davidtuite/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/devise-3.2.2/app/views"
      * "/Users/davidtuite/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/foundation-rails-5.0.3.1/app/views"
      * "/Users/davidtuite/.rbenv/versions/2.1.1/lib/ruby/gems/2.1.0/gems/kaminari-0.15.1/app/views"
  # ./app/views/er_registration_mailer/bailed.rb:17:in `signature'

Rails, кажется, ищет в app/views шаблон (или класс представления, я не уверен, какой именно).

Как я могу получить частичный рендеринг правильно?

Я использую Rails 4.0.3, Ruby 2.1.1 и stache 1.0.3.

Что я пробовал

Использование функциональности класса-оболочки stache gem вместо указания template_path для почтовых программ и добавления префикса между именами класса представления.

Я пробовал оба:

# app/views/registration_mailer/bailed.rb
module Wrapper
  module RegistrationMailer
    class Bailed < ::Stache::Mustache::View
    end
  end
end

и (обратите внимание на структуру каталогов):

# app/views/wrapper/registration_mailer/bailed.rb
module Wrapper
  module RegistrationMailer
    class Bailed < ::Stache::Mustache::View
    end
  end
end

Но я просто получаю ошибку Uninitialized const: Wrapper.

Я также пытался использовать усы, чтобы указать партиал в шаблоне почтовой программы:

# app/templates/er_registration_mailer/bailed.html.mustache
<!-- HTML as in above code sample -->

{{{>shared/mailer/sig}}}

Это просто дает мне другую ошибку «не найдено».


person David Tuite    schedule 05.03.2014    source источник


Ответы (1)


Вот пример использования Stache с почтовиком:

# config / initializers / stache.rb
Stache.configure do |c|
  c.template_base_path = Rails.root.join('app', 'views')
  c.wrapper_module_name = "Wrapper"

  c.use :mustache
end

# app / mailers / registration_mailer.rb
class RegistrationMailer < ActionMailer::Base
  default template_path: 'mailers/registration_mailer'

  def bailed(user)
   @user = user
   mail to: user.email
 end
end

# app / models / wrapper / mailers / regisration_mailer / bailed.rb
module Wrapper
  module Mailers
    module RegistrationMailer
      class Bailed < ::Stache::Mustache::View
        def continue_registration_link
          link_to "Continue registration by connecting your Twitter account", 
            connect_registrations_url
        end

        def signature
          @view.render "shared/mailer/sig"
        end
      end
    end
  end
end

Я думаю, что вам не хватает необходимости настраивать как модуль-оболочку, так и путь к шаблону.

person Kate    schedule 10.03.2014