Ruby 不使用模块化Sinatra应用程序的助手

Ruby 不使用模块化Sinatra应用程序的助手,ruby,sinatra,rack,view-helpers,Ruby,Sinatra,Rack,View Helpers,我在使用模块化Sinatra应用程序时遇到一些问题。我有一个主控制器和一堆从它继承下来的其他控制器。所以/映射到根,/auth映射到auth,等等 主要模块: require 'sinatra/base' # Lots of other requires # Helper module Utils def test puts "Test helper" return 'test' end end # Main app class Application < Si

我在使用模块化Sinatra应用程序时遇到一些问题。我有一个主控制器和一堆从它继承下来的其他控制器。所以
/
映射到
/auth
映射到
auth
,等等

主要模块:

require 'sinatra/base'
# Lots of other requires

# Helper
module Utils
  def test
    puts "Test helper"
    return 'test'
  end
end

# Main app
class Application < Sinatra::Base    
  helpers Utils

  # Lots of config
end
这导致:

命名者/

为Utils:Module调用了私有方法“test”


有点困惑。有什么帮助吗?

看来答案很简单

当通过
helpers()
包含模块时,其方法仅作为
method\u name()
而不是
ModuleName.method\u name()
可用


因此,在本例中,无论是在
Root
还是slim模板中,我所需要做的就是调用
test()

看起来答案非常简单

当通过
helpers()
包含模块时,其方法仅作为
method\u name()
而不是
ModuleName.method\u name()
可用


因此,在本例中,无论是在
Root
还是slim模板中,我所需要做的就是调用
test()

看起来答案非常简单

当通过
helpers()
包含模块时,其方法仅作为
method\u name()
而不是
ModuleName.method\u name()
可用


因此,在本例中,无论是在
Root
还是slim模板中,我所需要做的就是调用
test()

看起来答案非常简单

当通过
helpers()
包含模块时,其方法仅作为
method\u name()
而不是
ModuleName.method\u name()
可用


因此,在本例中,无论是在
Root
还是slim模板中,我所需要做的就是使用helpers模块调用
test()

,使其中的所有方法直接用于路由中的代码,而无需在其前面加上模块名

您可以这样做:

get '/' do
  puts test

  # view() Defined directly in `Application`, runs slim
  view :index
end

您得到的是为Utils:Module调用的
私有方法'test',而不是为Utils:Module
调用的
未定义的方法'test',这是因为内核中已经存在,因此,它可以作为所有类上的私有方法使用。

使用helpers模块可以使路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称

您可以这样做:

get '/' do
  puts test

  # view() Defined directly in `Application`, runs slim
  view :index
end

您得到的是为Utils:Module调用的
私有方法'test',而不是为Utils:Module
调用的
未定义的方法'test',这是因为内核中已经存在,因此,它可以作为所有类上的私有方法使用。

使用helpers模块可以使路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称

您可以这样做:

get '/' do
  puts test

  # view() Defined directly in `Application`, runs slim
  view :index
end

您得到的是为Utils:Module调用的
私有方法'test',而不是为Utils:Module
调用的
未定义的方法'test',这是因为内核中已经存在,因此,它可以作为所有类上的私有方法使用。

使用helpers模块可以使路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称

您可以这样做:

get '/' do
  puts test

  # view() Defined directly in `Application`, runs slim
  view :index
end

您之所以得到为Utils:Module调用的
私有方法'test',而不是为Utils:Module
调用的
未定义的方法'test',是因为内核中已经有一个内部方法,因此它在所有类上都可以作为私有方法使用。

有没有一种方法可以实现与此相反的效果(对于名称空间问题),即,定义一个模块,使其助手方法可以使用模块名称调用,并且仍然可以访问请求上下文和Sinatra的其他助手(例如,
会话
)?在OP的例子中,为了能够从路由调用
Utils.test
,而不是普通的
test()
?@ArmanH我看到了你关于这个的问题和悬赏。我认为没有一个干净的方法来做你想做的事。通过在模块中使用名称,该方法将在不同的上下文中运行,但您需要它位于相同的上下文中才能获取其他帮助程序。(当然,这是Ruby,可能有一些黑客的方法可以让它工作)。有没有一种方法可以实现与此相反的效果(对于名称空间问题),也就是说,定义一个模块,使得它的助手方法可以用模块名调用,并且仍然可以访问请求上下文和Sinatra的其他助手(例如,
会话
)?在OP的例子中,为了能够从路由调用
Utils.test
,而不是普通的
test()
?@ArmanH我看到了你关于这个的问题和悬赏。我认为没有一个干净的方法来做你想做的事。通过在模块中使用名称,该方法将在不同的上下文中运行,但您需要它位于相同的上下文中才能获取其他帮助程序。(当然,这是Ruby,可能有一些黑客的方法可以让它工作)。有没有一种方法可以实现与此相反的效果(对于名称空间问题),也就是说,定义一个模块,使得它的助手方法可以用模块名调用,并且仍然可以访问请求上下文和Sinatra的其他助手(例如,
会话
)?在OP的例子中,为了能够从路由调用
Utils.test
,而不是普通的
test()
?@ArmanH我看到了你关于这个的问题和悬赏。我认为没有一个干净的方法来做你想做的事。通过在模块中使用名称,该方法将在不同的上下文中运行,但您需要它位于相同的上下文中才能获取其他帮助程序。(当然,这是Ruby,可能有一些黑客的方法可以让它工作)。有没有一种方法可以实现与此相反的效果(对于名称空间问题),即定义一个模块,这样它的helper方法可以用模块名调用,并且仍然可以访问请求上下文和Sinatra的其他helper(e