同樣是用 rack 為基礎的兩個框架,
有些是相似的地方,有些不同,
從這樣對照,可看出 sinatra 的簡易。
Sinatra Book 提供了蠻完全,
但不見得完整的教學介紹,
看完試完這些基本功能後,
剩下就與其他的套件看要怎麼組合。
在此以較常會用到的來舉例比較一下。
路徑
在 rails 如果要指定用 GET 或 POST 或其他方法,
得在 config/routes.rb
雖然可以用 resources :dogs 一次就把 REST 的機制建制,
但常常也會需要自行做一些的彈性的寫法。
get "room/listscore"
post "room/add_score"
map.zhbook 'zhbook/:bookid/:format', :controller => 'recbook', :action => 'showzhitem'
而 sinatra 直接在 rails 眼中類似的 controller 作用的檔案中:
get '/dog/:id' do
# 如果只找一個項目:
@dog = Dog.find(params[:id])
# 可在路徑裡指定參數
end
post '/dog' do
# 以POST傳資料
end
put '/dog/:id' do
# 可用同樣的路徑,但方法不同,就可對應到不同的動作。
end
delete '/dog/:id' do
# 這是 CRUD 常會用到的刪除的動作。
end
網址參數
上面看得到 /dog/:id 是用 params[:id] 來取得。
固定檔案的位置
假設我把這個專案叫 I5 這目錄,
simple.rb 程式檔放其中,
同目錄建個叫 public,
一些圖檔、CSS、JavaScript都放其中,
這與 rails 的 public 目錄是相同的。
├── I5
│ ├── public
│ │ ├── css
│ │ ├── img
│ │ └── js
│ └── simple.rb
檔案下載
在 rails 送出檔案要這樣子寫:
send_file("/home/ironman/test1/FILES/#{@dlfile.filetoken}",
:filename => "#{@dlfile.filename}",
:type => "#{@dlfile.filetype}",
:stream => true,
:disposition => "attachment")
#:disposition => "inline")
而在 sinatra 只要這樣子寫:
get '/download' do
attachment 'coolfile.txt'
send_file '/path_to/anyNameFile.txt'
end
就可做個檔案下載用的網站。
一些指定的動作
直接寫出些文字:
# rails 是
def show
render :text => 'Hi,鐵人五'
end
# sinatra
get '/show' do
'Hi,鐵人五'
end
網址轉向
#rails
redirect_to :action => 'index'
redirect_to "http://ithelp.ithome.com.tw"
#sinatra
redirect '/someplace/else'
以不同格式畫出內容
原來的Rails 需要這麼做,但好處是,
如果同一個action要提供不同的格式,
像 html, json,就一次寫在 respond_to 裡
def show
@asset = Asset.find(params[:id])
respond_to do |format|
format.xml { render :xml => @asset.to_xml }
end
end
但rails可以這樣子的方式:
render :json => result
#而 sinatra 要這樣子:
content_type 'text/javascript', :charset => 'utf-8'
result.to_json
有了上述的基本web使用的認識,
就可實驗實作些有趣的功能了。
看看這個合不合用:
http://sinatra-org-book.herokuapp.com/
或者用這個自己跑給自己看:
https://github.com/cschneid/sinatra-book