缺少'模板'对于ActionMailer,但仅在测试模式下运行时...直接调用ActionMailer基类

时间:2014-10-18 17:46:35

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

这有点令人费解,在生产或开发中运行此代码时,Rails并没有抱怨没有找到模板,但当我将其运行到测试模式时,它给我一个错误,说它无法找到“邮件程序” “模板......

ActionMailer::Base.mail(:from => 'x@s.com', :to => "webmaster@az.com", :subject => 'some test', body: 'some body).deliver

我甚至尝试使用格式块,为.html和.text指定{render text:'x'},但没有运气。

这是Rails 4。

谢谢!

1 个答案:

答案 0 :(得分:3)

好的,我发现了问题,因为rails是关于约定的,当传递给邮件程序的“BODY”为nil时,它会尝试从类名中猜测模板路径名和视图名。因此,即直接使用此方法时。我必须调试rails框架才能找到它:

即。在gems / actionmailer-4.1.6 / lib / action_mailer / base.rb:

这个方法是问题的答案,因为你可以看到body 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