我有一个由多个应用程序组成的Padrino项目,我想写一个模块,以避免在每个子应用程序中重复这个:
class MySubApp < Padrino::Application
register Padrino::Rendering
register Padrino::Helpers
register Padrino::Warden
enable :sessions
before do
env['warden'].authenticate!
end
get '/debug' do
...
end
end
相反,我想写这个:
class MySubApp < Padrino::Application
include MyAppsExtension
end
我一直在尝试不同的事情来定义模块中的重复代码并嵌套在Sinatra模块中,但我仍然无法正确地定义它。
此外,我尝试在我的应用程序和Padrino :: Application之间创建一个中间类,但是我遇到了很多错误,并且Sinatra DSL功能(之前/获取...)丢失了。
我该如何写这样的扩展名?
答案 0 :(得分:1)
如果您可以将MyAppsExtension
作为扩展名,那么在注册时,会调用registered
方法并传递实际应用。在此方法中,您可以按照自己的喜好设置应用,包括注册其他扩展程序。
module MyAppExtension
def self.registered(app)
# use 'app' as you would use 'self' in your app
app.register Padrino::Rendering
app.register Padrino::Helpers
app.register Padrino::Warden
app.enable :sessions
app.before do
env['warden'].authenticate!
end
app.get '/debug' do
...
end
end
end
然后您可以像使用任何其他扩展程序一样使用此功能:
class MySubApp < Padrino::Application
# 'register', not 'include'
register MyAppsExtension
end
请注意,您不需要将扩展模块作为Sinatra
模块的子类。有些扩展可以做,包括Sinatra文档示例中的扩展。如果您希望在经典风格的Sinatra应用中使用扩展程序(无需调用register
),则需要调用Sinatra.register MyExtension
,但这对于模块化应用程序来说不是必需的。