从预定作业在Pony邮件中呈现haml时未定义的方法`haml'

时间:2012-07-08 23:12:32

标签: sinatra haml rufus-scheduler pony

我有一个sinatra应用程序执行黄瓜测试并发送电子邮件通知及其结果。电子邮件gem是Pony,这个通知有一个haml模板。

此逻辑在路线中起作用:

require 'sinatra'
require 'haml'
require 'pony'

get "/execute_all/?" do
  execute_all_tests()
  Pony.mail :to => "recipients@email.com",
      :from => "do-not-reply@email.com",
      :subject => "Test results,
      :html_body => haml(:email_layout)

      redirect "/"

end

但是当我使用rufus调度程序的预定作业执行这些操作时,我得到以下异常:

scheduler caught exception:
undefined method `haml' for main:Object

代码是来自路线的copypasta:

   scheduler = Rufus::Scheduler.start_new
   scheduler.every '2h' do
      execute_all_tests()
      Pony.mail :to => "recipients@email.com",
          :from => "do-not-reply@email.com",
          :subject => "Test results,
          :html_body => haml(:email_layout)
   end

所有两个方法都在同一个文件中,执行以运行Sinatra app。

如何摆脱此异常,并使用haml模板发送电子邮件作为预定作业?

2 个答案:

答案 0 :(得分:7)

haml方法仅在对Sinatra的请求的上下文中可用(它是Sinatra::Base上的实例方法),并且不能在Sinatra请求之外使用。

为了渲染Haml模板,您可以直接使用Haml API:

haml_template = File.read(File.join(settings.views, 'email_layout.haml'))

scheduler = Rufus::Scheduler.start_new
  scheduler.every '2h' do
    execute_all_tests()
    Pony.mail :to => "recipients@email.com",
      :from => "do-not-reply@email.com",
      :subject => "Test results",
      :html_body => Haml::Engine.new(haml_template).render(binding)
  end
end

这里我假设execute_all_tests正在使用Haml模板中引用的实例变量,因此我们将binding传递给Haml render方法以访问这些变量。您可能还需要将所需的任何Haml选项作为第二个参数传递给new

答案 1 :(得分:1)

你是否以同一个用户身份运行rufus和sinatra?这似乎是许多这些问题中反复出现的主题。