这次的开发中,使用thin作为服务器,sinatra作为web服务框架进行开发。下面讨论的是如何书写自己的插件,扩展sinatra框架。
自定义插件有两种方式,extension方法和helper方法。
extension方法
require 'sinatra/base'
module Sinatra
module PostGet
def post_get(route,&block)
get(route,&block)
post(route,&block)
end
end
register PostGet
end
在定义了PostGet模块后,只需要register就可以使用。
require 'sinatra'
require 'post_get'
configure do
set :port,5000
end
post_get '/' do
"hi"
end
helpers方法
有两种定义方法。一种module定义,一种采用块进行定义。
require 'sinatra/base'
module Sinatra
module LinkHelper
def link(name)
case name
when :about then '/about'
when :index then '/index'
else "/page/#{name}"
end
end
helpers LinkHelper
end
require 'sinatra'
helpers do
def link(name)
case name
when :about then '/about'
when :index then '/index'
else "/page/#{name}";
end
end
end
如上,定义了link的扩展方法。在之后的方法体中,直接调用link方法即可。
extension和helper的混入定义方法
require 'sinatra/base'
module MyExtension
module Helpers
# helper methods go here
end
# extension methods go here
def self.registered(app)
app.helpers Helpers
end
end
Sinatra.register MyExtension
因为Sinatra.register方法体中,我们可以看到如下代码:
def register(*extensions, &block)
extensions << Module.new(&block) if block_given?
@extensions += extensions
extensions.each do |extension|
extend extension
extension.registered(self) if extension.respond_to?(:registered)
end
end