也許是使用Java久了,覺得每個程序都應(yīng)該這么復(fù)雜繁瑣,所以當(dāng)?shù)谝淮问褂肦oR在5分鐘內(nèi)完成一個帶驗證的CRUD頁面后,我徹底地迷上了Rails了,原來寫程序可以這樣簡單而充滿樂趣?。?/span>
總結(jié)一下這個簡單的過程:
①下載InstantRails并解壓
RoR推薦的運行環(huán)境是Linux/Unix環(huán)境,但在Linux/Unix下的安裝配置比較麻煩(可以參加JavaEye上Robbin寫的文章),在這里以Windows為例,InstantRails是一個Windows下RoR的集成運行環(huán)境,目前最新的版本是2.0。它內(nèi)部集成了運行RoR的所有必須配置,包括:ruby 1.8.6、Rails 2.0.2、gem 1.0.1,甚至還內(nèi)置了Apache, Mongrel服務(wù)器以及MySQL服務(wù)器。
當(dāng)然你可以說這種集成配置不能滿足生產(chǎn)環(huán)境下高性能的要求,那么你可以參考Robbin下的另一篇Windows下配置RoR環(huán)境的文章,不過這篇文章中的版本已經(jīng)過低,而且有些地方(負載均衡)省略了幾個步驟,所以必須結(jié)合Apache的文檔進行配置才能成功。
如果你只是想盡快體驗RoR的魔力,那么到RubyForge上下在這個InstantRails已經(jīng)足夠。下載后解壓就可以立刻運行了。這里有一個需要注意的地方:
“由于InstantRails是一個自包含環(huán)境,也就是說它有自己獨立的,隔絕的運行時環(huán)境,所以你需要執(zhí)行任何RoR的命令行操作,都必須通過菜單I(就是左上角那個傾斜的I圖標--->Rails Applications ---> Open Ruby console window)進行,通過這個方式打開的命令行窗口,默認加載了RoR運行的所有組件,如果你是通過普通的Windows開始菜單--->運行命令打開的,則可能會出現(xiàn)類似這樣的錯誤:ruby, rails, rake不是可識別或運行的命令”
②創(chuàng)建項目的目錄結(jié)構(gòu)
和J2EE Servlet規(guī)范一樣,RoR同樣有固定的目錄結(jié)構(gòu),通常目錄結(jié)構(gòu)如下:
●app:用來存放models,controllers,views,helper代碼的(MVC模型)
●config:用來存放應(yīng)用的配置,最重要的就是database.yml文件
●db:用來存放數(shù)據(jù)庫文件的,RoR內(nèi)置了Sqlite數(shù)據(jù)庫,一個數(shù)據(jù)庫就是一個.sqlite3文件
●public:這個是用來存放css,js,image的地方,頁面的所有CSS,JS,圖片鏈接都相對于這個目錄
●script:功能無比強大的目錄,里面有代碼生成,啟動服務(wù)器,下載并安裝插件的命令
●vendor:用來存放第三方插件的目錄
好,講了這么多那么如何自動生成這個目錄結(jié)構(gòu)呢?只需要在在Ruby運行時console窗口輸入一條命令:
rails depot
一切搞定!depot就是我們項目的名稱,剩下的事情由rails命令去做
③創(chuàng)建數(shù)據(jù)庫并測試連接
很簡單是吧!下面我們開始創(chuàng)建一個數(shù)據(jù)庫,由于Rails默認內(nèi)置了Sqlite數(shù)據(jù)庫(當(dāng)然也支持其它數(shù)據(jù)庫),所以我們采用最簡單的方式(但不代表性能或功能就差!)。我們打開上面提到的config目錄下的database.yml文件。見到如下內(nèi)容:




















這個文件告訴我們,此刻RoR采用的數(shù)據(jù)庫適配器是sqlite3,如果是在開發(fā)環(huán)境下我們的數(shù)據(jù)庫文件將會是名為:development.sqlite3的文件。另外有對應(yīng)的測試,生產(chǎn)數(shù)據(jù)庫,目前這一切都只是紙上談兵,我們需要讓他們getting real!
rake db:create RAILS_VERSION='development'
搞定!此時回到db目錄下,你會看到一個名為development.sqlite3的文件已經(jīng)存在了,這就是我們的數(shù)據(jù)庫(不需要任何額外的軟件,不需要冗長的安裝或復(fù)雜的配置)。也許你會奇怪這個rake命令是干什么的?其實他就類似Java世界中的Ant或Maven,是一個用于構(gòu)建的工具
④創(chuàng)建model,controller,view....
我們決定要實現(xiàn)一個能夠用于添加,修改,刪除,展示產(chǎn)品的web應(yīng)用,每個product都有title,description,image,price數(shù)據(jù)。在傳統(tǒng)的Java做法中,我們需要做以下的步驟:
A.定義Domain
B.使用XML文件定義一個映射文件
C.通過ORM工具建立Domain和XML描述的表格之間的映射
D.編輯web.xml文件,定義一系列的過濾器,servlet,mapping
E.創(chuàng)建一至多個Sevlet來完成Controller的功能
F.定義sevice接口和實現(xiàn)接口
G.定義dao接口和實現(xiàn)接口
H.在Spring的配置文件中定義DataSource,IoC,事務(wù)管理器
有時侯我們只是要實現(xiàn)一個看似很簡單的功能,但是Java的框架和思維已經(jīng)把我們限制在一個奇怪的圈子“沒有使用XML文件的應(yīng)用就不是好的應(yīng)用,因為他不夠靈活~~,沒有使用三層結(jié)構(gòu)的應(yīng)用就不是好的應(yīng)用,因為它的邏輯會耦合”。的確在企業(yè)級應(yīng)用這種做法無疑是正確且必須的!但是如果放在Web,互聯(lián)網(wǎng)的環(huán)境中這種做法無疑過于笨重,我們需要需要盡快地把創(chuàng)意變成可以看得見的東西(敏捷宣言第二條:我們認為可以工作的軟件 勝過 面面俱到的文檔)
讓我們來看看rails如何簡化程序員的工作吧!
ruby script/generate scaffold product title:string description:text image_url:string price:decimal
接下來我們會看到在console窗口輸出了一大堆東西,最重要的是它幫我們創(chuàng)建了如下的資源:
包括了模型:product.rb,控制器:products_controller.rb,視圖:index,new,edit,show。一切都有了
⑤為數(shù)據(jù)完整性添加控制
為了讓我們的程序更加智能,我們決定添加某些驗證的功能,例如非空驗證,長度驗證,唯一性驗證,格式驗證,數(shù)字驗證。一切都沒有問題,Rails早就幫我們想好了。于是我們來到app/models/product.rb。使用文本編輯器編輯這個文件,加入如下的命令:




從字面上看我們知道這分別用于驗證某些字段非空,長度不能下小于10個字符,價格必須是數(shù)字類型,而且標題必須全局唯一。太簡單了!
⑥Getting real
上面我們通過4個簡單的命令就完成了一個簡單的帶驗證功能的CRUD功能的應(yīng)用,那么是不是一切就完成了呢?不是---我們還需要真正的提交:migrate。我們需要把我們所做的一切工作告訴rails,這樣rails才會把這些工作映射到底層的數(shù)據(jù)庫。于是我們再次執(zhí)行
rake db:migrate
好了!提交工作完成,migrate真是一個魔術(shù)般的命令,它能知道當(dāng)前所做的工作有哪些是已經(jīng)提交的,那些是未提交的(嗯~很有版本控制的味道嘛,而實際上這也是用了版本控制的理念,只不過是在sqlite3的數(shù)據(jù)中維護一個叫做:schema_info/schema_migration的表用來記錄migration的版本號)
⑦瀏覽我們的工作
在ruby運行時console窗口,我們輸入如下命令:ruby script/server WEBrick,啟動WEBrick服務(wù)器,然后在瀏覽器輸入如下地址:http://localhost:3000/products
一切就是如此簡單!我們擁有一個可以進行CRUD的簡單應(yīng)用了,而這一切不過僅僅依靠幾行命令及幾行代碼
⑧總結(jié)
下面我們來回憶一下整個過程,我們會發(fā)現(xiàn)使用RoR創(chuàng)建Web應(yīng)用真是如此簡單而充滿樂趣!
●命令:
A.rails 項目名稱
B.rake db:create RAILS_VERSION='數(shù)據(jù)庫模式'
C.ruby script/generate scaffold 表名 字段名:字段類型
D.rake db:migrate
E.ruby script/server WEBrick
●代碼:
validates_presence_of :title, :description, :image_url, :price
validates_length_of :title, :minimum => 10
validates_numericality_of :price
validates_uniqueness_of :title
只需要花你差不多了5分鐘的時間而已~,That's all !
●注意點:
首先,上面的所有命令最好都基于項目的頂級目錄下執(zhí)行。其次對于rake db:migrate 這個命令,建議在每一次都模型進行修改操作后都執(zhí)行一次。就像我們每次修改了代碼后使用SVN的commit命令一樣,越早提交越好,提交的改變越小越好。事實上,這也符合敏捷開發(fā)的原則:小步前進,頻繁提交和重構(gòu)
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。