codecamp

Sinatra 运行一个模块化应用

有两种方式运行一个模块化应用,使用 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


Sinatra 模块化 vs. 传统的方式
Sinatra 应用/类 变量域
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

Sinatra 配置

Sinatra 错误处理

Sinatra Sinatra::Base - 中间件,程序库和模块化应用

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }