介绍Ruby On Rails

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


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

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)設計

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

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

stacks.jpg

對於一個有經驗的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)展示一下:

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一樣。設計師可以盡量用一行就可以描述一串程式動作,加上所有類別都提供相當實用的成員函式, 便產生非常簡潔的程式碼。

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語言個人認為比較值得看的參考,就是下列網址:

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

Rails

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

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

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

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

rails_intro_1.jpg

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)的方式來快速開發及佔有市場。

參考連結

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值