3

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

4

2 回答 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 回答