2008年4月5日 星期六

第一個資料庫應用(with scaffold)--Ruby on Rails 完全新手手冊


在自己不斷遭受到失敗與挫折之時,雖然一度對ROR產生了小小的反感,"沒式改什麼版,書都沒用了"。不過仔細想想,沒有工具書到不全然是工具的問題,沒人出書這才是重點。其他較為流行的語言(例如C, Java)在國內都有許多不同的版本之書籍可供參考;反觀ROR,目前市面上幾乎都是翻譯書(我還沒看到有自己寫的~"~),而原文書有提到Rails2.0最快也要五月份才會有書出現(亞馬遜上查的)。難道這段時間就只能苦苦摸索嗎?!!終於皇天不負苦心人,讓我找到一篇關於在Rails使用靜態scaffold step by step (動態scaffold在Rails 2.0 已廢除)這邊文章。那麼就讓我們一起跟著做做看吧^^。

第一步:開始

在開始之前,先讓我們仔細想一想,我們要的東西是什麼?我們要怎麼樣安排資料庫中的資料?在這邊我就先舉一個簡單的例子:假設我們要開一個網路商店,那麼我就先建立一個store專案。(後面=>就是要輸入的程式碼)
=>rails store

第二步:建立資料庫

建立完專案之後呢,我們就要來決定我們的資料庫名稱。這個資料庫名稱老實說不怎麼重要,就隨便想想吧...嗯,那就也叫store好了XD。決定了之後我們就要來更改資料庫的設定檔。在 store\config 目錄下有個檔案叫做 database.yml 的檔案,打開文字編輯器來修改裡面的內容(在這邊建議使用 AptanaStudio 或是 SciTE來編輯,因為使用win的記事本會因為作業系統斷行符號的不同而產生難以閱讀的現象)。#號是註解符號,所以就不用看了。從developmet開始看,我們需要把內容改成下列這樣:
development:
adapter: mysql #調節器名稱,隨便填應該也可以拉
database: store_development #資料庫名稱
timeout: 5000 #可以不用管
username: root #mysql的帳號
password: #mysql的密碼
host: localhost #可接收的連線範圍
(這邊要注意一下,因為ruby對空白字元與tab是敏感的,所以在冒號後面一定要有一個空白,否則會出錯!!)這邊我們可以看到,資料庫名稱為 store_development,這樣的命名方式是內定的。其意義是指開發中的資料庫,在 development 敘述下還有test與production,其意義就是測試與成品資料庫。命名當然也就是 store_test 與 store_production。如果打算要做成品的話就要全部都填寫清楚,在這邊我們只是測試開發,所以可以只填好development的區段,其他就不管了。
修改完設定檔後,我們下這一行指令來建立資料庫:
=>rake db:create
(如果要順便建立test用與production的資料庫可以下 rake db:create:all)
執行之後如果沒有什麼錯誤訊息那就可以了,假如你不放心,那可以下mysql的指令或是利用像是phpMyAdmin的資料庫管理軟體來檢查是否資料庫已經建立。

第三步:Scaffolding!

在我參考的文章中在這一步有去做確認網站有沒有架好,但是我覺得這那真的是多餘的動作,所以就不做了。讓我們來想想下一步要怎麼進行。現在我們有了資料庫,那麼還要建立一個表格(table)來存放記錄(records),並且決定表格中的欄位(名稱)。這邊最重要的是表格的名稱,他最後會在MVC中都會出現(MVC有機會以後再說XD),依照命名規則,他必須是一個英文名詞,且須為複數型,那麼因為商店裡面有很多好玩的小玩意兒,所以就決定是...items拉(我知道很爛,但是不要打我)。接下來決定欄位的名稱,先做個簡單的吧,有名稱(title)、描述(decription)與價位(price)就夠了;名稱的資料型態為 string, 描述為text, 價位則為 integer。那麼輸入指令:
=>ruby script/generate scaffold Items title:string description:text price:integer
這時候就可以發現ruby又幫我們建立了許多檔案,其中在store\db\migrate中有一個 001_create_items.rb 我們可以打開來檢查看看,應該就會像下面這樣:
class CreateItems < ActiveRecord::Migration
def self.up create_table :items do |t|
t.string :title
t.text :description
t.integer :price
t.timestamps
end
end
def self.down drop_table :items
end
end

第四步:Migration

檢查完上面的檔案沒有問題之後,我們就可以來執行下面的指令:
=>rake db:migrate
出現成功訊息就好啦!!如果失敗的話呢...請檢查1.database.yml有沒有設定錯誤 2.mySql資料庫有沒有正在執行,使用者權限是否有開放給設定檔的那個使用者等等

第五步:執行server

老實說...就沒第五步ㄇㄟ,寫辛酸的拉,執行server已經在第一篇文章有說過了:
=>ruby script/server
這樣應該就能看到成果出現啦!!什麼?不知道怎麼看到網頁?唉呦,就是 http://localhost:3000/Items 因為在這邊我們用到的控制器(controller)是item的複數型態。

補充

其實在設定資料庫的幾個步驟,可以利用其他的資料庫軟體來完成,像是建立資料庫、建立table等,都有許多方法可以達到同樣的效果。不過在這邊就是盡量的使用ruby給我們的工具,來熟悉一下,等有心得了再來換成習慣的工具也不遲。
當然,這樣用scaffold做出來的網頁雖然快速,但是還是略嫌粗糙了點。所已接下來就是看書的時間拉,雖然rails1.2和2.0 scaffold使用的方法不同,但是書上在介紹完後,還是會開始繼續一些我們在製作動態網頁的技巧。所以階段性任務達成!!下次來研究架站或是考慮要不要把簡易ruby手冊的後半給補完^^"

*關於命名規則的單複數型態:在1.2版的 rails scaffold必須要在資料表格(table)、控制器(controller)使用複數型態,而在模型(model)使用單數型態。但在測試過 rails 2.0的 scaffold之後,發現應該沒有很明確的規定單複數要怎麼使用。藉由其 scaffold產生的模型、控制器、資料表格將會以相同的名稱命名。

**如果要以其他工具自行建置table,需注意 rails在 table中一定需要一欄為id的索引(作為主鍵),如果用rake來幫忙建造則會自動建置。

注:本篇圖案與主題無關....

沒有留言: