我正在学习Sinatra并试图将我的大脑包裹在Sinatra::Base
。 documentation不能轻易回答这个问题:
Sinatra::Base
负责什么?
有没有一种简单的方法来考虑它? (也许有一个好图或什么?)
或者答案只是一长串的功能? (例如:“Sinatra::Base
负责错误,过滤器,路由,模板等等。”)
或者它是否简单:“Sinatra::Base
是 Sinatra,减去执行上下文,Sinatra::Application
”?
答案 0 :(得分:2)
Sinatra::Base
没有授权的Sinatra。请考虑以下代码 with delegation:
# app.rb
require 'sinatra'
get '/' do
render :template
end
此样式为您提供免费的选项解析器:
$ ruby app.rb -h
Usage: app [options]
-p port set the port (default is 4567)
-o addr set the host (default is localhost)
-e env set the environment (default is development)
-s server specify rack server/handler (default is thin)
-x turn on the mutex lock (default is off)
当您使用应用程序运行脚本时,它还会使用适当的Rack处理程序启动服务器,因此您不必编写任何相关代码。
它的作用只是因为Object
在Sinatra::Delegator
中使用sinatra/main
进行了扩展。请参阅http://git.io/zWl7RA和http://git.io/NxgpBg。它将所有Sinatra DSL方法委派给预先配置的Sinatra::Base
实例,即Sinatra::Application
。
以模块化样式编写应用程序时,不会委派任何内容。你只是继承了基地:
require 'sinatra/base'
class Application < Sinatra::Base
get '/'
render :template
end
end
Application.run!
因此,Sinatra::Base
目前负责在Rack,Tilt和其他依赖项之上实现所有Sinatra DSL方法。