我在 Sinatra 应用程序中使用 Rufus 调度程序。 我可以从“scheduler do”块中访问辅助方法吗?我没能做到这一点(我得到一个“未定义的方法‘检查’主要:对象”错误)所以现在我必须在助手块中定义该方法(也可以在“post '/' do”块中使用它) ),然后将方法的主体复制到调度程序块。这没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗?
这取决于您的调度程序的使用地点。块将有权访问其本地上下文,因此如果您在有权访问助手的地方使用它,那么它也应该有权访问该助手。
部分摘自文档
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
话虽如此,您将无法像这样访问
scheduler
,所以:
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 do
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
一切都非常复杂!您可以混合搭配并找到适合您需求的方案。
我在看http://japhr.blogspot.jp/2009/03/sinatra-innards-deletgator.html
你可能可以这样做:
# in a.rb
module A
class << self; include A; end
def nada
puts "nada"
end
end
# in another file...
require 'sinatra'
helpers do
include A
end
scheduler.every('20s') do
A.nada
end