助手不使用模块化 Sinatra 应用程序
Helpers not working with a modular Sinatra app
我在 helpers 使用模块化 Sinatra 应用程序时遇到了一些问题。我有一个主控制器和其他一些继承自它的控制器。所以 /
映射到 Root
,/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
"Controllers"继承Application
,喜欢:
class Root < Application
get '/' do
puts Utils # Exists
puts Utils.test # Breaks
# view() Defined directly in `Application`, runs slim
view :index
end
end
这导致:
NoMethodError at /
private method `test' called for Utils:Module
有点难过。有帮助吗?
嗯,看起来答案很简单。
当通过 helpers()
包含一个模块时,它的方法变得可用 method_name()
而不是 ModuleName.method_name()
。
所以在这种情况下,在 Root
和 slim 模板中,我需要做的就是调用 test()
使用 helpers 模块可以让路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称前缀。
你可以这样做:
get '/' do
puts test
# view() Defined directly in `Application`, runs slim
view :index
end
你得到 private method `test' called for Utils:Module
而不是 undefined method `test' for Utils:Module
的原因是因为内核中已经有一个 test
method,因此它可以作为私有方法在所有 类.
我在 helpers 使用模块化 Sinatra 应用程序时遇到了一些问题。我有一个主控制器和其他一些继承自它的控制器。所以 /
映射到 Root
,/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
"Controllers"继承Application
,喜欢:
class Root < Application
get '/' do
puts Utils # Exists
puts Utils.test # Breaks
# view() Defined directly in `Application`, runs slim
view :index
end
end
这导致:
NoMethodError at /
private method `test' called for Utils:Module
有点难过。有帮助吗?
嗯,看起来答案很简单。
当通过 helpers()
包含一个模块时,它的方法变得可用 method_name()
而不是 ModuleName.method_name()
。
所以在这种情况下,在 Root
和 slim 模板中,我需要做的就是调用 test()
使用 helpers 模块可以让路由中的代码直接使用其中的所有方法,而无需在其前面加上模块名称前缀。
你可以这样做:
get '/' do
puts test
# view() Defined directly in `Application`, runs slim
view :index
end
你得到 private method `test' called for Utils:Module
而不是 undefined method `test' for Utils:Module
的原因是因为内核中已经有一个 test
method,因此它可以作为私有方法在所有 类.