2012-04-14 111 views
1

如果我的Sinatra应用程序结构如此。从西纳特拉复制帮助如何在多个Sinatra应用程序中包含配置

 

require 'sinatra/base' 

class LoginScreen Sinatra::Base 
    enable :sessions 

    get('/login') { haml :login } 

    post('/login') do 
    if params[:name] == 'admin' && params[:password] == 'admin' 
     session['user_name'] = params[:name] 
    else 
     redirect '/login' 
    end 
    end 
end 

class MyApp Sinatra::Base 
    # middleware will run before filters 
    use LoginScreen 

    before do 
    unless session['user_name'] 
     halt "Access denied, please login." 
    end 
    end 

    get('/') { "Hello #{session['user_name']}." } 
end 
 

如果两个应用程序需要相同的配置,例如,佣工,寄存器和资产包中的问题将是。如何在不重复代码的情况下使两个应用程序之间保持一致。我可以做这样的事吗?

 

require 'sinatra/base' 

class LoginScreen Sinatra::Base 
    include_relative("config_file.rb") 
    enable :sessions 

    get('/login') { haml :login } 

    post('/login') do 
    if params[:name] == 'admin' && params[:password] == 'admin' 
     session['user_name'] = params[:name] 
    else 
     redirect '/login' 
    end 
    end 
end 

class MyApp Sinatra::Base 
    # middleware will run before filters 
    include_relative("config_file.rb") 
    use LoginScreen 

    before do 
    unless session['user_name'] 
     halt "Access denied, please login." 
    end 
    end 

    get('/') { "Hello #{session['user_name']}." } 
end 

config_file.rb 
helpers Sinatra::Helper1 
helpers Sinatra::Helper2 
helpers Sinatra::Helper3 
register Sinatra1 
register Sinatra2 
register Sinatra3 
 

回答

3

如何使用继承?

class MyBase < Sinatra::Base 
    configure do 
    helpers Sinatra::Helper1 
    register Sinatra1 
    end 
end 

class LoginScreen < MyBase 
end 

class MyApp < MyBase 
    use LoginScreen 
end 

这种方式,配置文件会从MyBase下降的所有应用程序之间共享。

相关问题