3

SinatraアプリでRufusスケジューラーを使用しています。「schedulerdo」ブロック内からヘルパーメソッドにアクセスできますか?私はそれを行うことができませんでした(「main:Objectの未定義のメソッド `check'」エラーが発生します)ので、ヘルパーブロック内でメソッドを定義する必要があります(「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 に答える