Ruby在Sinatra的Rufus调度程序里,如何构建长尾?

2026-04-11 17:171阅读0评论SEO问题
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计613个文字,预计阅读时间需要3分钟。

Ruby在Sinatra的Rufus调度程序里,如何构建长尾?

在Sinatra应用中,使用Rufus调度程序。能否从`scheduler.do`块中访问辅助方法?没有具体的方法做到这一点(遇到一个未定义的方法`main`:Object错误)。因此,目前我必须在`scheduler.do`块中直接编写代码。

我在Sinatra应用程序中使用Rufus调度程序.
我可以从“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

或者你可以将它放在模块的类实例变量中:

Ruby在Sinatra的Rufus调度程序里,如何构建长尾?

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

一切都非常复杂!您可以混合搭配,找到适合您需求的产品.

本文共计613个文字,预计阅读时间需要3分钟。

Ruby在Sinatra的Rufus调度程序里,如何构建长尾?

在Sinatra应用中,使用Rufus调度程序。能否从`scheduler.do`块中访问辅助方法?没有具体的方法做到这一点(遇到一个未定义的方法`main`:Object错误)。因此,目前我必须在`scheduler.do`块中直接编写代码。

我在Sinatra应用程序中使用Rufus调度程序.
我可以从“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

或者你可以将它放在模块的类实例变量中:

Ruby在Sinatra的Rufus调度程序里,如何构建长尾?

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

一切都非常复杂!您可以混合搭配,找到适合您需求的产品.