Sinatra 中的 Rufus 调度程序

问题描述 投票:0回答:2

我在 Sinatra 应用程序中使用 Rufus 调度程序。 我可以从“scheduler do”块中访问辅助方法吗?我没能做到这一点(我得到一个“未定义的方法‘检查’主要:对象”错误)所以现在我必须在助手块中定义该方法(也可以在“post '/' do”块中使用它) ),然后将方法的主体复制到调度程序块。这没有意义:(有没有办法避免重复?我可以在其他地方定义一个方法并在调度程序中调用它吗?

ruby sinatra scheduled-tasks rufus-scheduler
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 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

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


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
© www.soinside.com 2019 - 2024. All rights reserved.