分類
Books Programming Rails

Agile Web Development with Rails 第二版預告

 

Ruby on Rails 最重要的一本書 Agile Web Development with Rails, 2nd Edition 終於定稿送印了,即將在 12/15 上市,如果等不及也可以線上買PDF。這是個偉大的時刻搭配 Rails 1.2 的發布,它將涵蓋 RJS, migrations, resources, multi-format actions with respond_to, polymorphic associations 跟其他最新的功能。

想像一下這本書有多麼不容易,作者群除了撰寫 Rails 核心程式碼,還要分神寫書。Rails 1.2 RC才剛出來不久,等到你拿到這本書的同時,final release of 1.2 才正要熱騰騰發行呢~… :)

資料來源: Riding Rails 跟 DHH 部落格

分類
Programming Rails REST

什麼是REST跟RESTful?

Update(2008/5): 事隔一年多,我對於 Rails 如何應用 RESTful 這個概念有完全不同的切入角度,詳見 Practical Rails2 投影片。

Ruby on Rails 1.2 的一個重要進展是 RESTful,在了解怎麼用之前,我們要先了解什麼是 REST(Representational State Transfer)?

什麼是REST?

REST 是一種分散式超媒體系統(如WWW)的軟體架構風格,你可以想像它是一個良好設計的Web應用程式規則: 一組網路Web頁面(虛擬的狀態機器),其中 Client 透過點選超連結(狀態變換),結果是下個Web頁面(表示應用程式的下一個狀態)。

REST 所描述的網路系統包括三個部份:

  • data elements (resource, resource identifier, representation)
  • connectors (client, server, cache, resolver, tunnel)
  • components (origin server, gateway, proxy, user agent)
  • 幾個重點:

  • Data elements 由標準化介面存取
  • Components 透過介面傳輸 資源表徵 (representations of resources) 來溝通,而不是直接操作資源本身。
  • Connectors 提供 component 的抽象介面來溝通,隱藏溝通機制的實作細節。
  • Components 使用 connectors 來存取,connectors 提供資源的存取或居中。
  • 所有來自 connector 的 requests 必須包含所有必要的資訊來了解該 request,不需要依靠之前的request (即 stateless)
  • 分類
    JavaScript Programming Rails

    在Rails中用Yahoo UI! Dialog + RJS

    nap的這篇 YUI Dialog on Rails: First Pass 給了一個範例介紹在 Rails 中使用  Yahoo! UI Library 的 Dialog 並搭配 RJS 使用:

    首先把yui下載回來,把要用的 .js 檔集中放到 /public/javascripts/yui/ 下,css (/yui/build/container/assets/container.css) 放到 /public/stylesheets/yui/ 下。

    程式碼我就不轉貼了,我依樣畫葫蘆的範例在這裡 yui1,重點是按下Save時它用 Prototype 的 Ajax.Request() 呼叫 RJS Response,而不是用 YUI 的 Connection Manager,作者還加寫了一篇 Prototype vs YUI Connection Manager: Dialog continued…,給了 YUI Connection Manager的處理版本(好多行哩),作者是認為 Rails 的開發者比較熟Prototype,所以這裡就用Prototype版本來做囉。

    我個人是不太喜歡混雜用(怕有衝突?),所以如果要完全拔掉 Prototype,RJS應該可以改用 RJS minus R! 直接寫 YUI Javascript code。

    分類
    JavaScript Programming Rails

    RJS Minus R (MinusMOR)

    UPDATE (11/24): 順應大夥要求,Dan Webb重新發一個 MinusMOR 版本,使用 .ejs 來表示 JavaScript with embedded Ruby templates。這樣就可以跟本來的 .rjs 共存了。希望這個 pure Javascript template 以後可以加入 Rails core 囉~

    RJS是很棒的玩意,這殺手級的功能讓你寫AJAX response超簡單,只用Ruby即可。但是很明顯的它是個會漏的抽象層(leaky abstraction,事實上根據抽象滲漏法則,所有重大的抽象機制在某種程式上都是有漏洞的),一但開始漏而要寫raw Javascript時,在RJS中就要用page.call 之類的,但這就看起來比較醜陋,尤其是有Javascript條件式或raw Javascript很多的時候。另外就是RJS完全依賴Prototype跟Scriptaculous,如果你要改用別的Javascript framework時,Ruby版的RJS就不太有用了。

    from RubyInside

    因此如果你已經很熟 Javascript 跟 Prototype,或是你想改用別的 Javascript framework,可能就比較想直接用 Javascript 來寫 AJAX response,因此Dan Webb提出一個新選擇(新實驗?)  RJS Minus R (沒有Ruby的RJS!),MinusR 把 .rjs 改成寫 Javascript (用Erb內嵌Ruby code),主要就是給你一個 js helper 自動呼叫 to_json 來轉換 Ruby 資料。

    討論串在爭論說應該要用另外 extension 副檔名表示這種 pure Javascript,因為這個 plugin 目前更改了 .rjs 的定義,造成本來用ruby寫的 .rjs template 不能用了。這部份該怎麼實作解決似乎還沒有定論。

    DHH的回應說的很好,這是一個很好的實驗讓我們好好省思RJS,RJS不是萬靈丹,就像Rails的Active Record本身也是個會洩漏SQL抽象層,重點是如何讓80%的工作可以超簡單達成,and 另外的20%有彈性手動來變花樣。

    另一篇介紹文: RJS templates without the R!

    註: 目前的stable Rails版本不行跑這個 plugin,必須裝EdgeRails(開發中的Rails版本),請執行 rake rails:freeze:edge 安裝 (要有subversion)。另外 EdgeRails 只用於該 rails application,而不是整個升級系統 library 的Rails版本。

    分類
    Programming Rails Ruby WWW

    PlanetRubyOnRails

    最近新上線的 Rails 相關 RSS Feed 自動收集網站 www.planetrubyonrails.com/,相較於另一個 www.planetrubyonrails.org/ 多一些管理,介面比較好看,其中用黑底色表示必讀的文章,要看特定關鍵字文章的話,修改 subdomain 即可,如 rjs.planetrubyonrails.com/

    分類
    JavaScript Programming Rails

    UJS Rails Plugins : Unobtrusive Ajax for Rails

    正是我夢幻想要的啊!! 看完 DOM Scripting之後,對 Unobtrusive Javascript (可以參考 Jeremy Keith’s Behavioural Separation 的介紹) 念之不忘,想說 Rails 要怎麼支援 unobtrusive 跟degrades gracefully 的特性呢? 因為我們看到 Rails 內建的 helper 都是寫在HTML裡成 onclick = ‘xxx’ ,如支援 Ajax 的 link_to_remote 就是用 href=’#’ onclick=’new Ajax.Request(…)’ 云云。

    所以我想是不是要改寫 link_to_remote之類的,另外寫套 helper 來讓 Javascrit 不要與HTML混在一起。不過… 今天在 Ajaxian Unobtrusive Ajax for Rails by Dan Webb 上看到介紹,有個 UJS Rails Plugins,可以讓你用它的 helper 掛 javascript 到 event (用CSS-selector) 上,而不用跟 (X)HTML 混在一起,達到網頁 Behavioural 的分離。

    話不多說,請看作者的 Presentation Slides,真是太令人興奮了,作者的野心不小,非常令人期待。對網頁標準愛好者來說,這 plugin 真是太棒了。就算你不是基本教義派信徒,看到投影片的例子,焉不心動?… :p

    寫了一個簡單的 UJS demo,搭配 RJS 超讚~ 不過我覺得 UJS 有點多管閒事的地方是它預設修改 Rails 的 link_to , link_to_remote, form_remote_tag 等成 Unobtrusive 版本,把 onclick 通通移除了,當場讓我之前的RJS demo爛掉,好險code不用再改,只需補上 javascript_include_tag :unobtrusive 即可。

    至於degrades gracefully,因為連結都還保留著 href,所以就算使用者 Javascript 關閉,還是可以連到東西,只是server端要檢查是不是 ajax request 來決定回應什麼格式。