Nik*_*kov 4 haml sinatra pony rufus-scheduler
我有一个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
Run Code Online (Sandbox Code Playgroud)
但是,当我使用rufus调度程序执行这些操作的预定作业时,我得到以下异常:
scheduler caught exception:
undefined method `haml' for main:Object
Run Code Online (Sandbox Code Playgroud)
代码是来自路线的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
Run Code Online (Sandbox Code Playgroud)
所有两个方法都在同一个文件中,执行以运行Sinatra app.
如何摆脱这个异常,并发送带有haml模板的电子邮件作为预定的工作?
该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
Run Code Online (Sandbox Code Playgroud)
这里我假设execute_all_tests
使用的是Haml模板中引用的实例变量,因此我们将传递binding
给Haml render
方法来访问这些变量.您可能还需要传入您需要的任何Haml选项作为第二个参数new
.