我在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
一切都非常复杂!您可以混合搭配,找到适合您需求的产品.
