2014-10-18 2 views
2

Это немного озадачивает, при запуске этого кода в Production или Development, Rails не жалуется на то, что не найдет шаблон, но когда я запускаю это в тестовом режиме, он дает мне ошибку говоря, что не может найти «почтовой программы» шаблон ...Отсутствует «шаблон» для ActionMailer, но только при запуске в тестовом режиме ... Вызов базового класса ActionMailer напрямую

ActionMailer::Base.mail(:from => '[email protected]', :to => "[email protected]", :subject => 'some test', body: 'some body).deliver 

Я даже пытался играть с блоком формата, с указанием {визуализации текста: 'x'}, для .html и .text, но не повезло.

Это рельсы 4.

Спасибо!

ответ

3

ОК, я нашел проблему, поскольку рельсы - это все соглашения, она пытается угадать имя пути шаблона и имя вида из имени класса, когда «ТЕЛО», переданный почтовому отправителю, равен нулю. Так, например, при непосредственном использовании этого метода. Мне пришлось отлаживать рельсы, чтобы выяснить это:

I.e. на gems/actionmailer-4.1.6/lib/action_mailer/base.rb:

Этот метод был ответом на проблему, так как вы можете видеть, имеет ли тело eval значение nil, затем он идет по пути угадывания имен путей, и т. д .:

def collect_responses(headers) #:nodoc: 
     responses = [] 

     if block_given? 
     collector = ActionMailer::Collector.new(lookup_context) { render(action_name) } 
     yield(collector) 
     responses = collector.responses 
     elsif headers[:body] 
     responses << { 
      body: headers.delete(:body), 
      content_type: self.class.default[:content_type] || "text/plain" 
     } 
     else 
     templates_path = headers.delete(:template_path) || self.class.mailer_name 
     templates_name = headers.delete(:template_name) || action_name 

     each_template(Array(templates_path), templates_name) do |template| 
      self.formats = template.formats 

      responses << { 
      body: render(template: template), 
      content_type: template.type.to_s 
      } 
     end 
     end 

     responses 
    end 
Смежные вопросы