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就不太有用了。
因此如果你已經很熟 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版本。
發佈留言