我在Sinatra应用程序中使用Rufus调度程序. 我可以从“scheduler do”块中访问辅助方法吗?我没有设法做到这一点(我得到一个“未定义的方法`检查’为main:Object”错误)所以现在我必须在
我可以从“scheduler do”块中访问辅助方法吗?我没有设法做到这一点(我得到一个“未定义的方法`检查’为main:Object”错误)所以现在我必须在helpers块中定义方法(在“post”/“do”块中使用它也)然后将方法的主体复制到调度程序块.它没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗? 这取决于您的调度程序的使用位置.一个块可以访问它本地的上下文,所以如果你在某个地方使用它,你可以访问一个帮助器,那么它也应该可以访问帮助器.
部分取自the docs
class MyApp < Sinatra::Base # Hey, I'm in the application scope! helpers do def my_helper end end configure do scheduler.every('20s') do # my_helper is ***not*** accessible here end end get '/define_route/:name' do # Request scope for '/define_route/:name' scheduler.every('20s') do my_helper # my_helper is accessible here end end end
话虽如此,您将无法访问这样的调度程序,因此:
configure do set :scheduler, { Rufus::Scheduler.start_new } end
然后你就可以做到
get '/define_route/:name' do # Request scope for '/define_route/:name' settings.scheduler.every('20s') do my_helper # my_helper is accessible here end end
或者你可以将它放在模块的类实例变量中:
module MyScheduler def self.scheduler @scheduler ||= Rufus::Scheduler.start_new end end
然后您可以通过以下方式访问调度程序:
MyScheduler.scheduler
但my_helper仍然只能在请求范围内访问.如果要将方法作为帮助程序访问并在请求范围之外,则将其提取为jmettraux隐含于:
module MyHelpers def self.my_helper # do something end end
在西纳特拉:
helpers def my_helper MyHelpers.my_helper end end
那么可以做到:
configure do scheduler = Rufus::Scheduler.start_new set :scheduler, scheduler scheduler.every('20s') do MyHelpers.my_helper # my_helper is not accessible here # but the MyHelpers.my_helper is, because it's accessible everywhere end end # and/or get "another-route" do setting.scheduler.every('20s') do my_helper # my_helper is accessible here end end
一切都非常复杂!您可以混合搭配,找到适合您需求的产品.