iT邦幫忙

DAY 5
2

建立API為中心的輕量級網站系列 第 5

簡單的 Sinatra 與 Rails 使用對照

  • 分享至 

  • xImage
  •  

同樣是用 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使用的認識,
就可實驗實作些有趣的功能了。

系列文章列表


上一篇
一個檔案 Sinatra 超簡單上手
下一篇
用 Sinatra 實作簡單的夢幻筆名 API
系列文
建立API為中心的輕量級網站30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

2 則留言

0
Bater
iT邦新手 4 級 ‧ 2017-11-28 13:33:18

這個連結失效囉
http://sinatra-book.gittr.com/

看看這個合不合用:
http://sinatra-org-book.herokuapp.com/
或者用這個自己跑給自己看:
https://github.com/cschneid/sinatra-book

我要留言

立即登入留言