也許是使用Java久了,覺得每個程序都應該這么復雜繁瑣,所以當第一次使用RoR在5分鐘內完成一個帶驗證的CRUD頁面后,我徹底地迷上了Rails了,原來寫程序可以這樣簡單而充滿樂趣啊!
總結一下這個簡單的過程:
①下載InstantRails并解壓
RoR推薦的運行環境是Linux/Unix環境,但在Linux/Unix下的安裝配置比較麻煩(可以參加JavaEye上Robbin寫的文章),在這里以Windows為例,InstantRails是一個Windows下RoR的集成運行環境,目前最新的版本是2.0。它內部集成了運行RoR的所有必須配置,包括:ruby 1.8.6、Rails 2.0.2、gem 1.0.1,甚至還內置了Apache, Mongrel服務器以及MySQL服務器。
當然你可以說這種集成配置不能滿足生產環境下高性能的要求,那么你可以參考Robbin下的另一篇Windows下配置RoR環境的文章,不過這篇文章中的版本已經過低,而且有些地方(負載均衡)省略了幾個步驟,所以必須結合Apache的文檔進行配置才能成功。
如果你只是想盡快體驗RoR的魔力,那么到RubyForge上下在這個InstantRails已經足夠。下載后解壓就可以立刻運行了。這里有一個需要注意的地方:
“由于InstantRails是一個自包含環境,也就是說它有自己獨立的,隔絕的運行時環境,所以你需要執行任何RoR的命令行操作,都必須通過菜單I(就是左上角那個傾斜的I圖標--->Rails Applications ---> Open Ruby console window)進行,通過這個方式打開的命令行窗口,默認加載了RoR運行的所有組件,如果你是通過普通的Windows開始菜單--->運行命令打開的,則可能會出現類似這樣的錯誤:ruby, rails, rake不是可識別或運行的命令”
②創建項目的目錄結構
和J2EE Servlet規范一樣,RoR同樣有固定的目錄結構,通常目錄結構如下:

●app:用來存放models,controllers,views,helper代碼的(MVC模型)
●config:用來存放應用的配置,最重要的就是database.yml文件
●db:用來存放數據庫文件的,RoR內置了Sqlite數據庫,一個數據庫就是一個.sqlite3文件
●public:這個是用來存放css,js,image的地方,頁面的所有CSS,JS,圖片鏈接都相對于這個目錄
●script:功能無比強大的目錄,里面有代碼生成,啟動服務器,下載并安裝插件的命令
●vendor:用來存放第三方插件的目錄
好,講了這么多那么如何自動生成這個目錄結構呢?只需要在在Ruby運行時console窗口輸入一條命令:
rails depot
一切搞定!depot就是我們項目的名稱,剩下的事情由rails命令去做
③創建數據庫并測試連接
很簡單是吧!下面我們開始創建一個數據庫,由于Rails默認內置了Sqlite數據庫(當然也支持其它數據庫),所以我們采用最簡單的方式(但不代表性能或功能就差!)。我們打開上面提到的config目錄下的database.yml文件。見到如下內容:
D:\Workspace\RoR\depot>type config\database.yml
# SQLite version 3.x
# gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
adapter: sqlite3
database: db/development.sqlite3
timeout: 5000

# Warning: The database defined as 'test' will be erased and
# re-generated from your development database when you run 'rake'.
# Do not set this db to the same as development or production.
test:
adapter: sqlite3
database: db/test.sqlite3
timeout: 5000

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

包括了模型:product.rb,控制器:products_controller.rb,視圖:index,new,edit,show。一切都有了
⑤為數據完整性添加控制
為了讓我們的程序更加智能,我們決定添加某些驗證的功能,例如非空驗證,長度驗證,唯一性驗證,格式驗證,數字驗證。一切都沒有問題,Rails早就幫我們想好了。于是我們來到app/models/product.rb。使用文本編輯器編輯這個文件,加入如下的命令:
validates_presence_of :title, :description, :image_url, :price
validates_length_of :title, :minimum => 10
validates_numericality_of :price
validates_uniqueness_of :title
從字面上看我們知道這分別用于驗證某些字段非空,長度不能下小于10個字符,價格必須是數字類型,而且標題必須全局唯一。太簡單了!
⑥Getting real
上面我們通過4個簡單的命令就完成了一個簡單的帶驗證功能的CRUD功能的應用,那么是不是一切就完成了呢?不是---我們還需要真正的提交:migrate。我們需要把我們所做的一切工作告訴rails,這樣rails才會把這些工作映射到底層的數據庫。于是我們再次執行
rake db:migrate
好了!提交工作完成,migrate真是一個魔術般的命令,它能知道當前所做的工作有哪些是已經提交的,那些是未提交的(嗯~很有版本控制的味道嘛,而實際上這也是用了版本控制的理念,只不過是在sqlite3的數據中維護一個叫做:schema_info/schema_migration的表用來記錄migration的版本號)
⑦瀏覽我們的工作
在ruby運行時console窗口,我們輸入如下命令:ruby script/server WEBrick,啟動WEBrick服務器,然后在瀏覽器輸入如下地址:http://localhost:3000/products
一切就是如此簡單!我們擁有一個可以進行CRUD的簡單應用了,而這一切不過僅僅依靠幾行命令及幾行代碼
⑧總結
下面我們來回憶一下整個過程,我們會發現使用RoR創建Web應用真是如此簡單而充滿樂趣!
●命令:
A.rails 項目名稱
B.rake db:create RAILS_VERSION='數據庫模式'
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 !
●注意點:
首先,上面的所有命令最好都基于項目的頂級目錄下執行。其次對于rake db:migrate 這個命令,建議在每一次都模型進行修改操作后都執行一次。就像我們每次修改了代碼后使用SVN的commit命令一樣,越早提交越好,提交的改變越小越好。事實上,這也符合敏捷開發的原則:小步前進,頻繁提交和重構
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
posted on 2010-05-15 12:02
Paul Lin 閱讀(658)
評論(0) 編輯 收藏 所屬分類:
RoR