我在 Sinatra 应用程序中使用 Rufus 调度程序。我可以从“scheduler do”块中访问辅助方法吗?我没能做到(我得到一个“未定义的方法 `check' for main:Object”错误)所以现在我必须在 helpers 块中定义方法(也可以在“post '/' do”块中使用它) 然后将方法的主体复制到调度程序块。这没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗?
问问题
2428 次
2 回答
5
这取决于您的调度程序在哪里使用。一个块可以访问它本地的上下文,所以如果你在可以访问帮助器的地方使用它,那么它也应该可以访问帮助器。
部分取自文档
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
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
一切都非常复杂!您可以混合搭配并找到适合您需求的产品。
于 2013-01-31T16:04:59.157 回答
2
我在看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
于 2013-01-31T11:02:07.613 回答