我有一个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模板发送电子邮件作为预定作业?
答案 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?这似乎是许多这些问题中反复出现的主题。