Sinatra 101 (2)–快速構建一個Note系統

[b]Views[/b]
Sinatra中,默認所有的頁面都放在views目錄下,而且其支持多個html模板系統,比方說,haml,erb等等。這兒以Haml爲例,其他的模板系統使用方法類似。 Haml可以幫助我們更有效的編寫HTML文件。在Sinatra,使用haml非常方便,只需要在文件頭引入haml即可:
require 'haml'

使用:
get '/' do
haml :index
end

當訪問主頁面時, 服務器會查找views目錄下的index.haml文件返回。
!!!
%html(lang="en" )
%head
%title Note
%body Welcome to Note

[b]Layout,CSS[/b]
對於同一個系統,多個頁面的佈局大多數情況都是一樣的,爲了更好的重用代碼,Sinatra支持Layout, 即你只需要返回自己修改的內容部分,頁面的佈局可以指定一個模板,默認情況下,sinatra會默認選擇名爲layout.haml的文件作爲模板。 首先,創建一個layout.haml, 然後把模板代碼移動到該文件中, 同時,使用“”=yield“”,指定自己修改部分的位置:
!!!
%html(lang="en" )
%head
%title Note
%body
=yield

這樣,就可以移除index.haml代碼中的多餘部分,index.haml就只剩下一行代碼“Welcome to Note”。

如果你不想使用默認的模板名字,或者想在系統中支持多套模板,Sinatra支持自己指定layout, 用法如下:
get '/' do
haml :index, {:layout => :[your own layout name]}
end

另外,Sinatra默認把所有的靜態資源文件放在public目錄下,本例程中,使用了Bootrstrap作爲UI模板,因此,下載了最新的Bootstrap文件解壓到public目錄下。同時爲了實現footer樣式,還創建自己的css文件note.css,置於public目錄下。最後構建出的模板代碼如下:
!!!
%html(lang="en" )
%head
%title Note
%meta(charset="utf-8")
%meta(name="viewport" content="width=device-width, initial-scale=1.0" )
%link(href="/bootstrap/css/bootstrap.css" rel="stylesheet" )
%link(href="/bootstrap/css/bootstrap-responsive.css" rel="stylesheet" )
%link(href="/note.css" rel="stylesheet" )
%link(href="/favicon.ico" rel="shortcut icon" type="image/x-icon" )
%body
%div(id="wrap")
%div(class="container" )
=yield
%div(id="footer" )
%div(class="container" )
%p(class="muted credit" ) Example for Sinatra,Power by @xianlinbox

[b]Database[/b]
在Rails的世界,你只能選擇ActiveRecord來做ORM,在Sinatra中,你除了可以繼續使用ActiveRecord以外,你還有其他的選項,比如備受推崇的Data_Mapper.爲了簡單起見,本例程中使用了Data_mapper + Sqlite3來做數據庫服務。首先,安裝data_mapper和其對於sqlite3的適配器:
gem install data_mapper dm-sqlite-adapter

然後,連接數據庫,並創建Domain對象:
require 'data_mapper'
DataMapper.setup(:default, ENV['DATABASE_URL'] || "sqlite3://#{Dir.pwd}/development.db")
class Note
include DataMapper::Resource
property :id, Serial
property :content, String
property :create_at, DateTime
property :completed_at, DateTime
end
DataMapper.auto_upgrade!

其中“DataMapper.setup(:default, ENV[‘DATABASE_URL’] || “sqlite3://#{Dir.pwd}/development.db”)” 在初始化數據庫連接,如果用戶沒有設置“DATABASE_URL”環境變量,則使用本地的sqlite數據庫,這樣可以很輕鬆的在各個環境使用不同的數據庫。最後一句“DataMapper.auto_upgrade!”表示如果有數據有任何的改動,Database會自動升級,爲開發者省去一大煩惱。
寫完之後,可以在irb環境測試Domain對象已可工作:
[img]http://dl.iteye.com/upload/attachment/0083/4928/2fafbb44-0a14-38a5-8ec1-8e661c0115ff.png[/img]

[b]RESTFUL與CRUD操作[/b]
在現代軟件開發中,對於Web服務的接口,大部分的程序員都已經傾向於選擇RESTFUL形式的接口,Sinatra對此提供了完美的支持。在Sinatra完美的支持了HTTP的POST,GET,PUT,DELETE,其對應的對象操作就是Create,Read,Update和Delete。本例中就是按照這樣的風格實現的web interface。

* 使用POST方法創建Note
post '/' do
note = Note.new(:content => params[:content])
if note.save
status 201
else
status 412
end
redirect '/'
end

* 使用GET方法獲取Note
get '/note/:id' do
@note = Note.get(params[:id])
haml :note
end

* 使用PUT方法更新Note
put '/note/:id' do
Note.get(params[:id]).update(:content => params[:content], :completed_at => DateTime.strptime(params[:completed_at],'%Y-%m-%dT%H:%M:%S%z' ))
redirect '/'
end

* 使用DELETE方法刪除Note
delete '/note/:id' do
note = Note.get(params[:id])
note.destroy
redirect '/'
end

其實,從底層實現來說,Sinatra只是通過DSL來封裝了請求的路由,在Sinatra中除了這幾個方法之外,還有很多的路由特性,比方說Conditions, 它可以讓你根據request頭部的信息決定具體使用那一個路由,這可以讓系統輕鬆針對不同的平臺做不同的實現:
get '/foo', :agent => /Songbird (\d\.\d)[\d\/]*?/ do
"You're using Songbird version #{params[:agent][0]}"
end
get '/foo' do
# Matches non-songbird browsers
end

關於Sinatra的Route更多信息
最後效果完成圖如下:
[b]主頁:[/b]
[img]http://dl.iteye.com/upload/attachment/0083/4930/70a8460f-e204-31a3-a0a0-13ce8a0e11b9.png[/img]
[b]Update頁面: [/b]
[img]http://dl.iteye.com/upload/attachment/0083/4932/df5680e0-ee54-36cc-b559-47870c8565da.png[/img]
[b]Delete頁面: [/b]
[img]http://dl.iteye.com/upload/attachment/0083/4926/b600195d-badc-30ed-b0d9-181ccbf98cbd.png[/img]

源代碼地址:[url]https://github.com/xianlinbox/Note[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章