Sinatra 运行一个模块化应用
2023-12-20 15:44 更新
有两种方式运行一个模块化应用,使用 run! 来运行:
# my_app.rb
require 'sinatra/base'
class MyApp < Sinatra::Base
# ... app code here ...
# start the server if ruby file executed directly
run! if app_file == $0
end
运行:
ruby my_app.rb
或者使用一个 config.ru,允许你使用任何 Rack 处理器:
# config.ru
require './my_app'
run MyApp
运行:
rackup -p 4567
使用 config.ru 运行传统方式的应用
编写你的应用:
# app.rb
require 'sinatra'
get '/' do
'Hello world!'
end
加入相应的 config.ru:
require './app'
run Sinatra::Application
什么时候用 config.ru?
以下情况你可能需要使用 config.ru:
- 你要使用不同的 Rack 处理器部署 (Passenger, Unicorn, Heroku, …).
- 你想使用一个或者多个 Sinatra::Base 的子类。
- 你只想把 Sinatra 当作中间件使用,而不是端点。
你并不需要切换到 config.ru 仅仅因为你切换到模块化方式,你同样不需要切换到模块化方式,仅仅因为要运行 config.ru. 把 Sinatra 当成中间件来使用
不仅 Sinatra 有能力使用其他的 Rack 中间件,任何 Sinatra 应用程序都可以反过来自身被当作中间件,被加在任何 Rack 端点前面。这个端点可以是任何 Sinatra 应用,或者任何基于 Rack 的应用程序 (Rails/Ramaze/Camping/…)。
require 'sinatra/base'
class LoginScreen < Sinatra::Base
enable :sessions
get('/login') { haml :login }
post('/login') do
if params[:name] = 'admin' and params[:password] = 'admin'
session['user_name'] = params[:name]
else
redirect '/login'
end
end
end
class MyApp < Sinatra::Base
# 在前置过滤器前运行中间件
use LoginScreen
before do
unless session['user_name']
halt "Access denied, please <a href='/login'>login</a>."
end
end
get('/') { "Hello #{session['user_name']}." }
end
以上内容是否对您有帮助:
更多建议: