Ruby 让Sinatra助手在任何地方的模块中都可用?
我如何让我的Sinatra助手随处可见 有时我无法访问它们(例如,从模块,见下文)。我希望将它们绑定到“全局名称空间”s.t。它们可以在任何地方通过名称调用 下面是一个正在运行的Sinatra应用程序,演示了该问题Ruby 让Sinatra助手在任何地方的模块中都可用?,ruby,sinatra,Ruby,Sinatra,我如何让我的Sinatra助手随处可见 有时我无法访问它们(例如,从模块,见下文)。我希望将它们绑定到“全局名称空间”s.t。它们可以在任何地方通过名称调用 下面是一个正在运行的Sinatra应用程序,演示了该问题 require 'sinatra' helpers do def bar "bar" end end get '/helper' do bar #works end get '/module_and_helper' do Foo.foo #crash
require 'sinatra'
helpers do
def bar
"bar"
end
end
get '/helper' do
bar #works
end
get '/module_and_helper' do
Foo.foo #crashes. How can I fix this?
end
module Foo
extend self
def foo
bar
end
end
谢谢 感谢@engineersmnky。您可以定义一个单独的模块,并将其包含在应用程序中,而不是使用“helpers do”,从而使其在任何地方都可用
require 'sinatra'
module Helpers
extend self
def barrio
"barrio"
end
end
include Helpers
get '/helper' do
barrio #works
end
get '/module_and_helper' do
Foo.foo #works!
end
module Foo
extend self
def foo
barrio
end
end
据我所知,
帮助程序
是在应用程序的顶层定义的,使应用程序对象中包含的所有对象和方法都可以访问它。这里的问题是,您的模块是在应用程序本身之外的更高级别上定义的。为了解决这个问题,我建议将其包括在应用程序中,例如classsinatra::application;包括Foo;结束
或者在真正的顶层定义一个模块(例如,MyModule
),然后呼叫助手MyModule
,我恐怕不明白。当然,我的实际应用程序比包含的示例要大;我通过“要求”我的所有文件(包括路由、帮助程序和模块)然后调用run Sinatra::Application来运行它,在这种配置中,我在哪里可以/可以让模块使用帮助程序?