gpt4 book ai didi

ruby - Sinatra 中的 Rufus 调度程序

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:21 25 4
gpt4 key购买 nike

我在 Sinatra 应用程序中使用 Rufus 调度程序。我可以从“scheduler do” block 中访问辅助方法吗?我没有设法做到这一点(我得到一个“undefined method `check' for main:Object”错误)所以现在我必须在 helpers block 中定义方法(也可以在“post '/' do” block 中使用它) 然后将方法的主体复制到调度程序 block 。这没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗?

最佳答案

这取决于您的调度程序在何处使用。一个 block 可以访问它的本地上下文,所以如果你在某个地方使用它,你可以访问一个助手,那么它也应该可以访问这个助手。

部分摘自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

话虽如此,您将无法像那样访问 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

在 Sinatra 中:

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

一切都非常复杂!您可以混合搭配并找到适合您需求的内容。

关于ruby - Sinatra 中的 Rufus 调度程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14614199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com