SinatraアプリでRufusスケジューラーを使用しています。「schedulerdo」ブロック内からヘルパーメソッドにアクセスできますか?私はそれを行うことができませんでした(「main:Objectの未定義のメソッド `check'」エラーが発生します)ので、ヘルパーブロック内でメソッドを定義する必要があります(「post' /'do」ブロックでも使用するには) )次に、メソッドの本体をスケジューラブロックにコピーします。意味がありません:(繰り返しを回避する方法はありますか?別の場所でメソッドを定義してスケジューラーで呼び出すことはできますか?
質問する
2428 次
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 に答える