ruby – 在Sinatra的Rufus调度程序

我在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

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

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

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...