View
24.428
Download
5
Embed Size (px)
DESCRIPTION
Citation preview
http://creativecommons.org/licenses/by-nc/2.5/tw/
Ruby on Rails Part1: 簡介
2009年9月21日星期一
關於我
• 張文鈿 (a.k.a ihower)http://ihower.idv.tw/blog/
2009年9月21日星期一
關於我
• 張文鈿 (a.k.a ihower)http://ihower.idv.tw/blog/
• 和多股份有限公司 軟體設計師
http://handlino.com
2009年9月21日星期一
關於我
• 張文鈿 (a.k.a ihower)http://ihower.idv.tw/blog/
• 和多股份有限公司 軟體設計師
http://handlino.com
2009年9月21日星期一
什麼是 Rails?
• 開放原始碼 (採用MIT授權) 的 Web 框架,主要用於開發database-backed 的網站應用程式
• MVC (Model-View-Control )模式
• (幾乎可以)完全地 Ruby 開發環境,包括支援 Ajax、定義資料庫結構、ORM (object-relational-mapping) 機制操作資料庫等等。
• 2004 年由 David Heinemeier Hanson(DHH) 從 37signals 產品中獨立出來。
2009年9月21日星期一
設計原則與特色
• 不重複自己 Don’t Repeat Yourself (DRY)
• 慣例勝於設定 Convention Over Configuration
• 基於 Ruby 自然、簡潔的語法
• 更少的程式碼做更多事• 高生產力、開發迅速• 具備高度修改彈性• 寫出漂亮的程式碼、讓開發變有趣
2009年9月21日星期一
什麼樣的網站最適合使用 Ruby on Rails 開發?
• 一個資料庫形式的網站 (透過存取資料庫,動態產生
內容的網站) 或是有足夠規模到適合使用一個強大功能的框架。
• 一個特別而不適用於傳統的 CMS 系統 (若 Joomla 或 Durpal 完全符合你所需,這些系統會是更容易的選擇)
• 一個全新的應用,允許開發人員開始全新的資料庫跟軟體架構。
2009年9月21日星期一
Rails 的成長
• 2005 年 DHH 從獲得年度最佳 Hacker
• 2006 年 Rails 獲得 Jolt 年度最佳產品
• 2005~2006 年 Ruby/Rails 相關書籍銷售量提昇1552%
• Ruby 程式語言在 Tiobe 的排名從 26 名提升到現在第 10 名
2009年9月21日星期一
Rails 開發有多快?Java(Spring/Hibernate) Rails
交貨時間 4個月,每週約20小時 4個晚上(每晚5小時)
程式碼行數 3293 1164
組態行數 1161 113
類別數/方法數 62/549 55/126
Justin Gehtland 是 Java 專家,這是他一開始採用 Rails 的實際數據
2009年9月21日星期一
Rails 有多省程式碼?
• Justin Gehtland 提出 Java :Rails = 3.5 : 1
• Proc.net 提出 PHP : Rails = 10 : 1
• JavaEye 站長估計 JAVA : Rails = 10 : 1
• thegiive 實驗的結果 PHP : Rails = 8 : 1
2009年9月21日星期一
Rails clone
2009年9月21日星期一
Rails 如何運作?
C
M
V
MVCModel-View-Control
2009年9月21日星期一
DB schema使用 Ruby 語法定義
class CreatePeople < ActiveRecord::Migration def self.up create_table :people do |t| t.string :name t.integer :age t.date :birthday t.text :bio t.timestamps end end
def self.down drop_table :people endend
2009年9月21日星期一
Active RecordORM 機制
class Person < ActiveRecord::Base # 一行都不用寫end
person = Person.newperson.name "ihower"person.age = 18person.save
person = Person.find(1)puts person.name # 輸出 ihower
2009年9月21日星期一
Action Controller處理 HTTP request 流程
class PeopleController < ApplicationController
# GET /people def index @people = Person.all end end
2009年9月21日星期一
Action Controller處理 HTTP request 流程
class PeopleController < ApplicationController
# GET /people def index @people = Person.all end end
一個 method 代表一個 action
2009年9月21日星期一
Action Controller處理 HTTP request 流程
class PeopleController < ApplicationController
# GET /people def index @people = Person.all end end
instance variable 將會傳入 View
一個 method 代表一個 action
2009年9月21日星期一
Action View 可內嵌 Ruby 語法的 HTML
<html> <body> <h1>Guestbook</h1> <% @people.each do |person| %> <p><%= person.name %>: <%= person.bio %></p> <% end %> </body></html>
2009年9月21日星期一
Why Rails?
• 增加開發生產力• 讓寫程式變有趣• 快速原型(prototyping)
• 程式碼容易維護• 開放原始碼
2009年9月21日星期一
Because Rails is ...
• MVC 架構
• 適合敏捷式開發• 慣例勝於設定• ActiveRecord ORM 機制
• 不重複自己(DRY)
• 支援最新技術潮流 (Ajax 和 RESTful 介面)
• 內建測試能力• Ruby 程式語言(開發快)
• 料庫 Migration 機制
2009年9月21日星期一
Thank you.
參考資料:
Get to the Point! (http://johnwlong.com/slides/gettothepoint/)
Ruby on Rails slide by thegiive in COSCUPDelivery of the key adoption Factors and key characteristics of companies using ruby on rails by Michel Barbosa
2009年9月21日星期一
Ruby on RailsPart2: 入門
http://creativecommons.org/licenses/by-nc/2.5/tw/
2009年9月21日星期一
• 開始之前可以先閱讀這篇文章http://ihower.idv.tw/blog/archives/1743
• 本課程有上機步驟的網頁說明:http://ihower.idv.tw/course/rails.html
README
2009年9月21日星期一
什麼是 Web framework?
• 開發動態網站、網站應用程式、網路服務的軟體框架
• 開天之初,從最早的 Perl CGI、PHP、ASP,進化到全功能的框架,支援 MVC、Database 操作、URL 路徑、Template 機制、Cookie 處理、快取、Ajax、安全性機制....等
• 採用 Framework 不重複開發輪子,並讓程式有一定的規範容易維護開發。程式碼如何組織,Framework 已經幫你想好了。
2009年9月21日星期一
什麼是 MVC?• 一種軟體架構的設計模式,將軟體分成三個部分:Model、Controller、View
• Model 物件包裝了資料與商業邏輯
• 例如操作資料庫
• View 表示使用者介面,顯示及編輯表單
• 可內嵌 Ruby 程式的 HTML
• Controller 負責將資料送進送出 Model
• 處理從外界(e.g. 瀏覽器)來的 Request,與 Model 互動後輸出 View (e.g. HTML)
2009年9月21日星期一
DB
Controller
View Model
1.
2.3.
4.
2009年9月21日星期一
DB
ActionController
ActionView ActiveRecord
1.2.
4.5.
Routing
3.
Rails 如何實現 MVC?
2009年9月21日星期一
為什麼使用 MVC?
• 分離商業邏輯和使用者介面,讓前端與後端開發者可以獨立作業
• 容易保持程式的不重複性(DRY: Don’t repeat yourself)
• 讓程式碼有著一致性的結構,位置清楚、容易維護。
2009年9月21日星期一
Ruby on Rails 運作需求
• Ruby 1.8.6 或 1.8.7
• Rubygems (Ruby 的套件管理工具)
• 資料庫:Rails 預設使用 SQLite 3,支援 MySQL、Postgres、Oracle、DB2、MSSQL 等
2009年9月21日星期一
開始一個 Rails 專案 Hello World! (live demo & 上機練習)
2009年9月21日星期一
預設的路徑(Routes)規則
http://localhost:3000/welcome/say
Controller Action
# /config/routes.rbmap.connect ':controller/:action/:id'map.connect ':controller/:action/:id.:format'
2009年9月21日星期一
加入一個 Model 操作資料庫
(live demo)
2009年9月21日星期一
什麼是 ORM ?• ActiveRecord 是 Rails 內建使用的 ORM 工具
• ORM: Object-Relational Mapping
• 將資料庫表格 (table) 對應到類別 (classe)
• 提供類別方法對表格操作• 將資料庫列 (row) 對應到 物件 (object)
• 提供物件方法對個別的資料做操作• 將資料庫欄位 (column) 對應到物件屬性 (object
attribute)
2009年9月21日星期一
透過 script/console 練習 ORM 操作 (上機練習)
2009年9月21日星期一
script/* 指令?
• script/about
• script/console
• script/generate
• script/server
• script/plugin
2009年9月21日星期一
什麼是 Rake?
• 類似於 Make 的 Ruby 工具
• 方便設定執行指令的相依性
於是就可以執行 rake my:foo_task
# lib/tasks/my_task.rakenamespace :my desc "task description" task :foo_task => :environment do puts “foobarrrr” endend
2009年9月21日星期一
有哪些內建的 Rake 指令?
• rake -T
• rake db:migrate
• rake db:drop
• rake tmp:clear
• rake notes
2009年9月21日星期一
DB Migration?• 使用 Ruby 語法定義資料庫結構 (Schema)
• 讓資料庫的修改也可以版本控制• e.g. 軟體從第三版更新到第五版,資料庫如何更新??
• 跨資料庫通用• e.g. SQLite3、MySQL、Postgres...etc
• 實務上,還在開發中的專案可以直接修改過往的 Migration,砍掉重練資料庫即可。
2009年9月21日星期一
Rails 的目錄架構• app
• controllers
• helpers
• models
• views
• config
• db
• doc
• lib
• log
• public
• script
• test
• tmp
• vendor
2009年9月21日星期一
Rails environments
• 預設有三種環境: development, production, test mode
• 設定不同的資料庫• 設定不同的 Log level、Session store,
custom library, Email setting 等
• 可自定 environment
2009年9月21日星期一
產生 controller 及 view 可以新增資料 (live demo & 上機練習)
2009年9月21日星期一
產生 controller 及 view 可以瀏覽資料 (live demo & 上機練習)
2009年9月21日星期一
產生 controller 及 view 可以編輯資料 (live demo & 上機練習)
2009年9月21日星期一
產生 controller 及 view 可以刪除資料 (live demo & 上機練習)
2009年9月21日星期一
什麼是 Helper ?• 可在 view template 中使用 helper method
• link_to
• form_for
• h (XSS攻擊不可不防)
• /app/helpers/* 可以自定你的 Helper
2009年9月21日星期一
建立 Layout (live demo & 上機練習)
• View 可以共用一個 Layout,作為 HTML 頭尾。
• 檔案預設是/app/views/layouts/application.html.erb
2009年9月21日星期一
flash hash (live demo & 上機練習)
• 內建的 flash hash 可以在 redirect 後跨 action 傳遞文字訊息
• 例如:成功建立、成功刪除等訊息
2009年9月21日星期一
DRY: Partial template(live demo & 上機練習)
• 將 View 中重複的程式抽出來
• 例如新增跟編輯的表單
2009年9月21日星期一
DRY: before_filter(live demo & 上機練習)
• 將 Controller 中重複的程式抽出來
• 例如依據 ID 找 Model 物件
2009年9月21日星期一
加入 Model Validation(live demo & 上機練習)
• 編輯 post.rb 加入 validates_presence_of :title
• 編輯 new.html.erb 及 edit.html.erb 加入 <%= error_messages_for :post %> helper
2009年9月21日星期一
Thank you.
參考資料:
Agile Web Development with Rails 3rd.RailsGuides http://guides.rubyonrails.org
2009年9月21日星期一