Ruby 让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

我如何让我的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 #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来运行它,在这种配置中,我在哪里可以/可以让模块使用帮助程序?