介绍Ruby On Rails

阅读更多

===转至 http://kiwi.csie.chu.edu.tw/blog/archives/133


本篇文章從PHP及Web程式設計師的角度,逐漸帶出Ruby on Rails這個Web Application Framework及其優點,架構觀念。接下來要簡介Ruby及Rails的學習重點。

  1. Web應用程式
    1. PHP面對的問題
  2. Ruby on Rails
  3. Ruby on Rails新手指南
    1. Ruby
    2. Rails
  4. 結論
  5. 參考連結

Web應用程式

記得在上次的的主題,重新探討Cakephp, Ruby on Rails與MVC ,我大力地闡述能否實做商業邏輯,或是掌握Model的功用是多麼的重要。而老話一句,這個問題比較會出現在中大型的Web應用程式中,如果說你正在寫的是小小的網頁作業,或許本文對你只有參考的價值。

我會這樣說,是因為我們已經邁向2008年,Web應用程式在Google大神的帶領之下 ,逐漸開始在放出光芒。

在2005年以前,對於很多使用者而言,瀏覽器只不過是個看網頁的東西。而網頁對大多數設計者而言,製作網頁就像在畫一幅畫。動態網頁設計被分做四大領域,平面設計結構設計行為設計伺服端程式設計 , 而這些設計可能會各別使用典型的Photoshop(or Flash),HTML/CSS Editor,Javascript Editor,PHP來完成。然而我舉PHP的例子,大家也應該可以想像的到,它是這五六年間最熱門的伺服端程式語言,如phpbb, phpmyadmin,xoops等高水準,開放原碼的應用程式大家早就耳熟能詳。相較於當時任何可以做出成品的伺服端語言,其直譯式語言的優點,快速編 輯,方便佈局(deploy) ...說到要寫動態網頁,PHP真是首選!

而這些東西在2006年之後就起了大變化,主要還是因為使用者比以往需要更多從瀏覽器得到的資訊,不僅只是看個靜態的網頁,更是將資料傳送出去。當 人們開始這樣用Web表單不斷地把資料往Internet送,並期待畫面下一瞬間就有符合需求的東西的時候,已經不是在「看網頁」,而是在使用Web應用程式 。是的,Web應用程式這個名詞其實還並未真正的深植人心,因為非資訊領域的使用者他們對於Web的認知還是僅僅在於靜態網頁,而資訊領域相關的已經對Web有種使用視窗程式的印象。實際上不管是Google也好,博客來也好,大家都是在用Web應用程式。

從設計者的角度來看,大概在PHP成為主流的時候,重心已經從平面設計逐漸轉移到伺服端程式設計。舉個例來說,你會發現外包網頁製作工作室來製作官 方網頁的業者,在快要完工時,針對內容資料性及操作性正確與否的要求,遠比Flash動畫順暢度及效果還要來得優先(以往是剛好反過來,美工優先)。就像 你使用Word,先不管他的介面是否如Word 2007般炫麗,可是在程式上看到的的排版,跟列印出來紙張上的排版一定不能不一樣。由於PHP連結資料庫的功能相當穩定,解決了資料及操作性的問題後, 設計師們慢慢地就將焦點拉回到Web應用程式的反應速度上。包括平面設計師在內,許多人無一不想讓Web程式像是視窗程式一樣反應快速,也因此將大家遺忘 許久的Javascript找了回來。

PHP面對的問題

從2000年到現在,設計的重心大概是依照HTML -> PHP -> JS來演進,語言的特性也從Tag Language -> Script -> Pure OO Script演進。這樣子的演進,不僅說明了伺服端程式碼的彈性相當重要,因為你可以看見大家不再需要靜態的HTML而是可以產生動態HTML的PHP, 而更明顯的是,大家開始需要瀏覽器的彈性。

在這時代演進中,PHP程式設計師遇到許多問題像是:

  • PHP並不是一個很好的物件導向語言,直到PHP5的時候雖然有,不過也不夠完整。
  • PHP原本附的資料層函式及PDO,或者是Adodb,要進行複雜的關連設計與對應相當困難。能夠做到複雜關連的如Propel,卻又效能太差。
  • 樣版引擎的優點是快速,可是只能稍微簡化畫面的結構問題,並未能解決商業邏輯與控制程式碼混雜問題。
  • 綜合以上原因,如果你要撰寫一個有500個使用案例的大系統,會導致設計複雜化。
  • Framework如Cakephp解決了不少上述問題,可是因為多數Framework開發週期過長而使得普及率未如想像中高。
  • Web應用程式因為HTML,CSS等本來就需要打許多程式碼,但PHP也佔了相當多。因此要完成大系統,需要更多人力進行實際程式碼撰寫而無法將時間花在設計上,開發時程也相對拖長。

我們在面對的已經是上百個使用案例這樣的複雜Web應用程式,競爭對手如Adobe已經推出了AIR(前Apollo),微軟也推出了 ASP.Net Ajax與Silverlight。這些強勢的對手們,目標當然是更強的Web Framework。PHP的任何framework甚至函式庫,是否能有效地"Rapid Development"都是一個問題,更何況是要挑戰這些對手。

Ruby on Rails

Ruby on Rails這個Web Application Framework早在2004年7月的時候,就由David Heinemeier Hansson 率領著37signals 打造了一個專案管理系統叫做Basecamp 。 先不管Basecamp好不好用,而它帶來的影響力就是大家都會問說「這究竟是怎樣寫的?」,也跟著Web2.0的風潮風光了一陣子,之後Rails才逐 漸浮上抬面。一個軟體要有人用,在於設計符合使用者需求,而又讓他們感到習慣的介面。但如果今天所謂的使用者也就是寫程式的人,那他們的希望就是,要能夠 有效率地做出或者維護一個系統及其使用案例,有方便的API可以降低反覆打同一行程式碼的動作。

Rails的第一個最大的優點就是,他可以以同一個語言加上簡短的函式呼叫囊括結構(HTML),行為(Javascript),及伺服器程式語言(Ruby)設計

我自己都認為光這一點對很多人來說就是救星了。

至於第二大優點,那就多了~

對於一個有經驗的Web程式設計師而言 Rails具有下列優點:

  • 簡短的函式呼叫,拯救你快殘廢的手指
  • MVC的設計架構讓你的資料及商業邏輯,控制程式碼,畫面完全分開,"No More Spaghetti Code!"
  • ActiveRecord讓你不需要撰寫SQL,並使用Object-Relational Mapping(物件-關連資料庫映射),與Hibernate同等級的關連功能存取資料庫
  • ActionController讓你有完全控制HTTP Session, Cookie, Request, Response的能力,整合了REST改變以往你對資源控制的想法,幾個基本的method就讓你寫完CRUD(新增修改刪除)。
  • ActionView讓你可以使用簡單的函式呼叫就產生複雜的HTML表單與Ajax Javascript程式碼。
  • 專業的Web設計師都懂得要先思考整個網站的Layout在去建構各個畫面,使用Layout更能發揮你的專業。
  • Rails不見得只是讓你Quick'n Dirty弄出個雛形,而且你絕對可以依賴Rails團隊的軟體品質而開發出更棒的產品。不怕你將Rails的功能挖完,只怕你還沒挖完Rails又出新功能!

對於一個Web程式設計新手 ,Rails帶給你的是:

  • 採用Ruby這個純物件導向直譯式語言,怎樣寫都可以work的程式風格會讓你快速就上手。
  • Rails在各種平台都有快速開發套件包,Windows是InstantRails ,Fedora6上打yum install rubygems即可。隨後在指令模式打上一行 gem install rubyworks -a,啥都幫你裝好。
  • Aptana IDE (前RadRails)採用Eclipse開發而成,能控制Mongrel伺服器,也能除錯程式碼,將HTML,CSS,JS,Rails整合的相當好。
  • 不會連MySQL,PostgreSQL?沒關係,把帳號密碼等資訊打在database.yml裡,還可以利用除錯Console測試連線。
  • Rails可以使用Scaffold(鷹架)建立基本的CRUD,甚至還支援漂亮的Ajax,彈指之間你發現你已經寫完了,而還不敢相信自己寫完了。
  • 既然畫面做完了,開始想怎樣修改既有的東西,利用Aptana下方工具列的Generators,你可以產生Model, Controller...等各種Rails程式碼框架,不用一一宣告半天。
  • 嫌功能不夠多嗎?察看Aptana下方工具列的Rails Plugin,看看你想加啥功能!
  • 低坡度的學習曲線讓你相當有成就感,不會像老前輩們以前天天踢鐵板踢到腳酸~

我相信Rails團隊是本持著對設計師們體諒的心,加上未來的夢想在設計整個framework,而不是在展現編程的實力堅強,這也是以往各種函式 庫做不出來的,相當值得所有設計師們學習。在撰寫這篇文章的時候,我也想過是否該提提Python及Django,因為他們也做的很好。

Ruby on Rails新手指南

Ruby

要使用Rails,非得學習Ruby不可。Ruby是一個純物件導向 的語言,意思是說在裡面任何東西,一個字串,一個數字都是一個物件。相較於其他script語言,ruby提供較多的與該物件相關且符合英文意義的成員函式,我們用ruby附的指令介面irb(interactive ruby)展示一下:

PLAIN TEXT
RUBY:
  1. -1 . class
  2. # output Fixnum
  3. -1 . abs
  4. # output 1
  5. 1 . succ
  6. # output 2
  7. 1 . succ . succ
  8. # output 3

可以看到1.succ會回傳1的successor(下一個數字)也就是2,而2的類別當然是Fixnum,也就是可以繼續呼叫succ,也因此有 1.succ.succ這種呼叫法。類似的作法在所有支援物件導向的語言都可見。而ruby不同的地方是他允許不加上"( )"便可以進行呼叫,只不過是沒有傳參數進去,也就是像VB一樣。設計師可以盡量用一行就可以描述一串程式動作,加上所有類別都提供相當實用的成員函式, 便產生非常簡潔的程式碼。

PLAIN TEXT
RUBY:
  1. say = "I love Ruby"
  2. puts say
  3. # Output "I love Ruby"
  4. # 字串提供"[ ]"成員函式來取得子字串,而下一行的功能就形同於取代
  5. say [ 'love' ] = "*love*"
  6. puts say. upcase
  7. # Output "I *LOVE* RUBY"
  8.  
  9. # 下行程式碼展示了Fixnum的成員函式times,而傳入一個"{ } ",稱作為區塊(物件),如此這個區塊內的程式碼會被執行五次。
  10. 5 . times { puts say }
  11. # Output "I *love* Ruby"
  12. # five times

剛剛有提到,ruby是一個純OO的語言,在程式裡任何東西皆為物件,自然就有物件該有的特性。

如果你想要試試語法,可以使用irb,ruby附的編輯器scite,或者是http://tryruby.hobix.com/ 。初學者最常見到就是不知道該呼叫啥成員函式,你可以透過http://www.gotapi.com/rubyrails 去查,或者是任何物件都有一個methods函式可以呼叫,至少你可以掌握你有什麼。

而目前針對ruby語言個人認為比較值得看的參考,就是下列網址:

  • http://www.zenspider.com/Languages/Ruby/QuickRef.html
  • http://www.ruby-doc.org/docs/ProgrammingRuby/
  • http://willh.org/cfc/wiki/index.php/Programming_Ruby,_1st_Edtion

如果你是熟悉Perl的老手,那Ruby對你而言是再快樂不過的事情了。.Net或是Java的也沒關係,花些時間深度地思考什麼叫做純物件導向,或者去看看Smalltalk,便能從語言面就瞭解Ruby。

Rails

因為Rails終究是一個MVC Framework,深讀MVC的內容是相當重要的,一個不小心你的程式碼就會有許多誤用,造成未來維護困難或效能緩慢。說起來就算是老手,一旦遇上趕專案的狀況,為了要快點寫完,很多時候也難逃誤用的命運。

但是在這裡我不詳述Rails的MVC究竟該怎樣去理解或開發,那是下一篇文章,先推薦Agile Web Development with Rails 及Ruby on Rails:Up and running 這兩本書好了。第一本書深入淺出,從觀念,目錄結構到撰寫流程解釋地相當詳盡,對於不是寫Rails的人來說,從中學習MVC也是相當棒的,可惜還沒有中文翻譯。第二本書以實做的角度直接切入程式碼,並且有中文翻譯,對於新手可以說是相當適合。

有關Rails的連結,最推薦的是:

  • http://wiki.rubyonrails.org/rails
  • http://lightyror.thegiive.net/

不過既然是介紹,免不了還是要說明一下目錄結構。

Rails的目錄結構如上圖,基本上大部分的程式碼都在apps/,也就是代表你的應用程式本身,在此我們僅介紹撰寫過程中一定會碰到的目錄。

所有的Controller類別基本上都繼承自application.rb,程式碼就擺在controllers/,讓你可以在其中寫所有 Controller共用的成員函式。Helper就是載入到view裡讓view可以呼叫的成員函式,所以application_helper.rb 也是同樣的情況。models/相當單純不用多解釋,而views/除了必須新增和controller同名小寫的目錄來擺rhtml以外,也可以使用所 謂的Layout功能。Layout就是讓所有的view可以選擇性地套入一個主樣版,通常我們在畫面設計上都會做成網站的外框。

在Rails專案產生完畢後,最先就是要編輯database.yml來設定好資料庫系統的存取方式。值得注意的是Rails預設提供三種應用程式 運作使用的環境設定,有development,test,production,分別代表開發時,進行單元測試時,及正式上線時。這三個設定檔理論上應 該分別設定在不同的資料庫,而啟動到底是使用了哪一個設定檔,就是看傳遞給web server怎樣的參數。此外如果有要預先require的函式庫或是include的module,都可以放在environment.rb裡。 route.rb負責上述URL的結構,也就是說那個結構是可以改的。

一個Web應用程式一定有靜態資料,包括圖片,css與js,分別擺在public/的images/,stylesheets /,javascripts/,並且在view裡可以透過image_tag, include_javascript_tag, stylesheet_link_tag來呼叫。Rails提供了DB Migration功能,讓你可以輕鬆地撰寫資料庫schema,並且可以視database.yml轉移到不同的資料庫,利用產生器的話,會自動產生在 db/。

結論

未來Rails的發展方向,不僅會在REST這個主題,使用JRuby來整合Java,甚至是Offline應用程式都有相當大的可能性。以往我發 現,任何視窗上的應用程式,免不了就是一定要遇到作業系統本身帶來的問題,如同Windows,可能他一更新,就封鎖掉你的應用程式。Web是一個開放的 平台,提供很多的創意空間,也不見得要用同一種技術解決問題,有多種瀏覽器可以選擇,不會被侷限在一個平台上。

文章到最後,當然還是得跟各位提一下Rails的缺點,畢竟是以純物件導向撰寫的Web應用程式,所需要的代價就是大量的CPU記憶體資源。也因為 這一點,有很多Rails的開發者也積極地加入叢集化的支援。但畢竟電腦硬體只會越快不會越慢,Web未來的趨勢還是會以敏捷編程(Agile Programming)的方式來快速開發及佔有市場。

參考連結

  • http://blog.roodo.com/rocksaying/archives/2680742.html
  • http://www.lis186.com/?p=1750
  • http://tw.myblog.yahoo.com/jimwayne-blog/article?mid=28&prev=29&next=27
  • http://inet6.blogspot.com/2006/12/ruby-on-rails.html
  • http://www.ibm.com/developerworks/cn/java/j-cb08016/
  • http://www.ibm.com/developerworks/cn/linux/sdk/php/php_design/index.html

written by Kiwi \\ tags: mvc , rails , ruby

 

你可能感兴趣的:(Rails,Ruby,PHP,Web,MVC)