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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号