Padrino自定义应用程序扩展

时间:2014-03-11 21:33:32

标签: sinatra padrino

我有一个由多个应用程序组成的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功能(之前/获取...)丢失了。

我该如何写这样的扩展名?

1 个答案:

答案 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,但这对于模块化应用程序来说不是必需的。