2009-11-17 119 views
9

我聽到一羣鐵軌開發者說RJS是邪惡的。我從來沒有使用它,因爲我總是設法使用經典的JavaScript或jQuery來做我想要的,所以我沒有注意。現在我正在進入一些遺留代碼,並且在那裏有RJS。RJS是邪惡的,爲什麼?

所以...是真的嗎?使用RJS有什麼缺點/優點?

+0

RJS的立場是什麼? – JaredPar 2009-11-17 17:35:03

+1

@JaredPar紅寶石Javascript – Joseph 2009-11-17 17:37:01

+2

大聲笑 - 起初我以爲這說「RMS」,我想知道你對Richard Stallman或均方根有什麼反應。 – 2009-11-25 06:37:59

回答

30

讓我們來談談RJS在進入它是否是邪惡之前。

RJS將相同級別的抽象應用於ActiveRecord爲SQL提供的高功能Javascript庫。然而,JavaScript庫的RJS覆蓋範圍遠不及ActiveRecord對SQL適配器的覆蓋範圍。

Rails僅支持原型/ Script.aculo.us的RJS支持。但是,有些插件可用或正在開發中以支持其他Javascript庫。例如JRails重寫基於Prototype的助手以使用jQuery。類似的插件存在於mootools和可能的Dojo中。

認爲RJS是邪惡的人通常是那些對原型代碼不熟悉的人,或者是那些認爲他們可以用原始Javascript更容易完成的事情的人。

RJS並不完美,就像ActiveRecord不完美一樣,每隔一段時間,您都必須寫下原始的Javascript或SQL來完成您的工作。再次像ActiveRecord一樣,使用高級選項越舒適,無需編寫原始代碼即可實現更多功能。

RJS的一個奇妙之處在於,它們本質上是視圖,可以生成Javascript。將RJS提取出來可以根據需要包含在部分中,這很容易,既可以作爲對控制器的響應,也可以作爲頁面中包含的自定義Javascript函數的一部分。這使得代碼更加乾燥,從而實現更簡單的維護。

我個人經常使用RJS。我發現它是一次接觸大量DOM元素的完美方式。它具有讓我創建AJAX豐富站點的雙重好處,而無需編寫太多的Javascript。然後我又恨寫Javascript。

+1

+1對解釋優點和缺點的優秀和簡潔的回答。作爲一名RoR新手,我總是想知道我是否應該在應用程序中使用RJS,或者使用像jQuery這樣的庫並自行處理。 – 2009-11-21 01:21:23

+1

一個很好的答案,謝謝! – 2009-11-23 11:52:48

+0

+1:榮譽EmFi!我對RJS或紅寶石一無所知。 (好吧,我知道他們存在...)我已經給出了一個+1,因爲你討論了關於RJS的事實以及人們爲什麼喜歡和不喜歡RJS的動機。做得好! – 2009-11-27 01:49:36

5

考慮到我在我的Rails項目中用JQuery替換了我的底層Prototype庫,我發現RJS非常有用。現在,將JavaScript傳回到要執行的服務器並不是主流。

但是,我發現一般RJS沒有問題。我唯一的抱怨是,我通常必須將RJS和普通的舊Javascript混合到我的.rjs文件中,所以它有點沒有意義。但它確實給了你一個乾淨的地方/方式來處理你的Javascript效果和AJAX調用,所以我認爲它是一個「放置代碼的標準位置」,這非常好。

+0

感謝您的回答!你可以把jQuery /經典JavaScript放入.rjs文件中嗎? – marcgg 2009-11-17 17:46:37

+1

@marcgg - 如果您使用的是JRails(http://github.com/aaronchi/jrails),那麼您可以將JQuery放入其中。但是,無論您使用哪種庫,傳統的Javascript都可以工作。有一種特殊的方法可以插入它。查看http://dev-journal.3dmdesign.com/development/qa-how-to-javascript-in-rjs-templates瞭解更多信息。 – 2009-11-17 18:10:14

3

我不知道我是否會說邪惡,但RJS(或任何服務器端語言生成JS)不會是我的第一選擇。我更願意親手寫JS。使用jQuery,我真的很喜歡編寫JS,並將JS保存在application.js中,感覺很乾淨。

擴大一點......我將RJS視爲不必要的抽象。我想知道JavaScript和jQuery。我想知道如何操作DOM以及如何進行AJAX調用。有了我的JS/jQuery知識,我可以很容易地移動到anotherframework,並且不會懷疑框架是否會爲我處理我的JS。

+0

RJS是嵌入式Ruby的JavaScript文件。這是一個與JavaScriptHelpers等不同的問題,它允許您執行以下操作: page.insert_html:bottom,'list', content_tag(「li」,「Fox」) – MattMcKnight 2009-11-24 05:25:58

+0

對,您正在編寫Ruby代碼以生成JavaScript,如果這對你有用,那真是太棒了。這不適合我。 – 2009-11-24 07:12:49

+0

我想這不是我所說的RJS。 RJS模板更像html.erb文件 - 用於將JS返回給瀏覽器的模板,以作爲對AJAX調用的響應進行評估。他們可能都是手工編碼的JS,但把紅寶石放在那裏讓我們插入你程序的其餘部分的值。 – MattMcKnight 2009-12-20 06:23:33

1

RJS很好,主要是因爲它很容易集成到Rails項目中。爲了保持簡單並保持文件數量較低,可以將其嵌入到控制器中,並且從原型/ scriptaculous庫中有許多易於使用的助手。它感覺更像Ruby。

它意味着它不像您正常的Rails代碼那樣乾淨地分離,因爲它與其他代碼很快混合在一起。它還需要通過原型和腳本化js文件包含更多的外部庫。

一些jQuery的東西很乾淨。語法非常瘋狂,但它意味着你可以將你的js完全從你的頁面/控制器(不引人注目的js)中拉出來,這是一種更乾淨/更劃分的做事方式。

更何況,jQuery看起來像JavaScript。所以你不會看到javascript和Ruby代碼的奇怪組合。我喜歡Ruby。我不喜歡Javascript。但我更喜歡兩者的混合。如果你知道JS,它會看起來很熟悉。

Ryan Bates將RJS轉換爲jQuery的截屏視頻。可以給你一個兩個語法上的區別的好主意:http://railscasts.com/episodes/136-jquery

+0

「還有什麼,jQuery看起來像javascript,所以你不會覺得javascript和Ruby代碼混在一起。」 這個說法是倒退的。與幫手,你沒有得到你的代碼中的JavaScript代碼,你會得到: page.insert_html:bottom,'list', content_tag(「li」,「Fox」) – MattMcKnight 2009-11-24 05:15:34

+0

這就是如果你爭論RJS 。如果我爭論JS,我不想在我的JS中使用Ruby代碼。仍然有很多實例獲得正確的JS功能,我最終使用JS而不是所有這些「助手」。它更容易。使用jQuery,我可以將所有內容從我的Ruby代碼轉移到Javascript中,並僅在必要時使用助手。 – Lukas 2009-11-24 19:49:16

1

如果您不熟悉JS(或Prototype等框架),但需要AJAX功能 - RJS是最好的方法。使用RJS的另一個優點是速度。方便快捷地寫入RJS代碼。

我在之前的所有Rails項目中都使用過RJS。現在我對Prototype(和jQuery)更加熟悉了,這就是我現在寫JS代碼的原因。我需要這個,因爲擁有大量RJS的控制器失去了生產力。並且將JSS代碼移出到JS是縮放控制器的第一步。

沒有人可以絕對地對你說,最好的方法是什麼 - 使用RJS或不使用RJS。大家應該選擇自己的方式。

例如,我更喜歡使用我的應用程序的管理部分中的RJS(無需縮放任何東西),併爲前端部分編寫JS。

1

RJS不是「邪惡」的,但我認爲它的問題是雙重的:

  1. 很難(不可能的?)做不顯眼的JavaScript和RJS。如果你正在編寫一個Javascript負載很大的應用程序,並且有很多邏輯,而且邏輯也改變了,你將不得不改變相當數量的文件,而不是隻改變一個文件。另外,這是個人偏好,看到標有壓縮的Javascript的標籤在整個過程中是相當醜陋的。

  2. RJS提取掉Javascript,這可能導致對該語言的無知。 RJS背後的想法是使開發人員能夠使用一種語言Ruby編寫Web應用程序的所有內容(除了設計人員可能處理的HTML和CSS)之外,但在實踐中,這同樣會出現短缺通過拖放控件或使用大量生成嚮導的繁重代碼來創建ASP.NET應用程序是可能的,但不推薦。如果你需要的只是一個簡單的解決方案,需要Ajax的傳播,那麼RJS就可以正常工作。

RJS是當你剛開始使用Rails的,需要的是有節制地使用(例如一些「快速和骯髒的」 Ajax效果的好工具,對於消失在同一博客的典型評論頁)。一旦你開始需要沉重的Javascript使用,那麼RJS就變得更加負責任了,因爲它將開發者從他們真正應該試圖理解的東西中屏蔽了出來。

+0

JavaScript不是最不引人注目的JavaScript形式嗎? – MattMcKnight 2009-11-24 05:12:26

+0

RE:第2點。我知道很多開發人員在沒有使用某種工具的情況下無法編寫Web服務,也無法在IDE的幫助下進行重構。我認爲問題在於開發人員,而不是工具 – 2009-11-26 21:34:14

0

RJS只是RHTML(現在稱爲html.erb)的JavaScript等價物。它是一個執行嵌入式Ruby的模板,並將JavaScript返回給瀏覽器以更新頁面。這使您可以更好地控制AJAX應用程序中服務器端操作的結果。實際上,RJS調用的結果由瀏覽器中的JavaScript解釋器進行評估。將其與非RJS AJAX應用程序進行對比,其中服務器返回通過異步請求的回調插入頁面的HTML。

「邪惡」部分是許多人對「eval」感到不舒服,但我認爲這也可能是某種混亂的結果。

這裏的許多回復似乎都集中在JavaScript,Prototype和Scriptaculous Helpers上,它們經常用作RJS模板的一部分,但並不是必需的。我會廣泛使用這些助手,因爲他們在模板中更好地使用Ruby代碼,但它們不是RJS的必要組成部分。