RJS是邪恶的吗?为什么?

9

我听到很多Rails开发者说RJS是邪恶的。我从来没有使用过它,因为我总是能够使用经典的JavaScript或jQuery做我想要的事情,所以我没有注意到它。现在我正在接触一些遗留代码,而且到处都是RJS。

那么...这是真的吗?使用RJS有什么缺点/优点?


RJS代表什么? - JaredPar
2
LOL - 一开始我以为这是“RMS”,我想知道你对Richard Stallman或均方根有什么意见。 - Andy West
7个回答

30
在讨论RJS是否邪恶之前,让我们先了解一下什么是RJS。
RJS将高级JavaScript库的抽象程度与ActiveRecord为SQL提供的相同水平相结合。然而,RJS对JavaScript库的覆盖范围远不及ActiveRecord适配器对SQL的覆盖范围完整。
Rails仅支持Prototype/Script.aculo.us的RJS。但是,有一些插件可用或正在开发中,以支持其他JavaScript库。例如,JRails重写基于Prototype的帮助程序以与jQuery配合使用。类似的插件也存在于mootools和可能的Dojo中。
认为RJS是邪恶的人通常是那些不舒服它生成Prototype代码的人,或者那些觉得他们可以轻松完成原始JavaScript的人。
RJS并非完美,就像ActiveRecord一样并非完美,偶尔需要转换为编写原始JavaScript或SQL来完成工作。再次像ActiveRecord一样,您越熟悉高级选项,就越能在不编写原始代码的情况下完成更多任务。
关于RJS的一个美妙之处是它们本质上是视图,可以生成JavaScript。将RJS提取到可以根据需要包含的局部视图中非常容易,无论是作为控制器响应的一部分还是作为包含在页面中的自定义JavaScript函数的一部分。这使代码更加DRY,从而简化了维护。
个人经常使用RJS。我发现它是同时触摸大量DOM元素的完美方式。它具有双重优势,可以让我创建富AJAX站点,而无需编写太多JavaScript。不过,我很讨厌编写JavaScript。

1
作为一名RoR新手,我经常在想是否应该在我的应用程序中使用RJS还是使用类库像jQuery并自己处理它。 - Wayne Molina
+1:夸奖EmFi!我对RJS或Ruby一无所知。(好吧,我知道它们存在…)我给了一个+1,因为你讨论了RJS的事实以及人们喜欢和不喜欢RJS的动机。做得好! - Jason D
那些认为RJS是邪恶的人,通常是因为他们不习惯它生成Prototype代码。你是指生成JavaScript代码吗? - tokland
tokland,是的和不是的。虽然RJS确实会生成Javascript代码,但默认行为(在撰写本文时,我不确定现在是否仍然如此)是生成与Prototype库高度依赖的Javascript代码。在这种情况下,Javascript同样适用于jQuery或任何其他使用Prototype的库。我想要区分RJS生成的不仅仅是Javascript代码。 - EmFi

5
考虑到我在我的Rails项目中将Prototype作为底层库替换为JQuery,我发现RJS非常有用。现在,将JavaScript传回服务器执行有时可能会很麻烦,因为它还不太常见。
然而,总体上我对RJS没有任何问题。我唯一的抱怨是我通常要在我的.rjs文件中混合使用RJS和普通的Javascript, 所以这有点无意义。但它确实为您提供了一个干净的地方/方式来处理您的Javascript效果和AJAX调用,所以我认为作为“放置代码的标准位置”,它非常好。

谢谢你的回答!你能把jQuery / classic javascript 放进 .rjs 文件中吗? - marcgg
1
@marcgg - 如果你正在使用JRails(http://github.com/aaronchi/jrails),那么你可以将JQuery放入其中。然而,无论你使用什么库,经典的Javascript都可以工作。不过,插入它的方式是有特殊方法的。请查看http://dev-journal.3dmdesign.com/development/qa-how-to-javascript-in-rjs-templates获取更多信息。 - Topher Fangio

3

我不知道是否可以说它是邪恶的,但RJS(或任何生成JS的服务器端语言)不会是我的首选。我更喜欢手写JS。使用jQuery时,我真的很享受编写JS并保持我的JS在application.js中的感觉很清爽。

再深入一点...我认为RJS是一个不必要的抽象。我想要了解JavaScript和jQuery。我想知道如何操作DOM以及如何进行AJAX调用。有了我的JS / jQuery知识,我可以轻松地转移到另一个 框架,而不必担心该框架是否会为我处理JS。


RJS 是一个包含 Ruby 的 JavaScript 文件。它是与 JavaScriptHelpers 等不同的独立问题,可以让您执行以下操作:page.insert_html:bottom,'list', content_tag(“li”,“Fox”) - MattMcKnight
没错,你正在编写 Ruby 代码来生成 JavaScript,如果这对你有用,那太棒了。只是对我来说不太适合。 - Andy Gaskell
我猜那不是我所说的RJS。RJS模板更像是html.erb文件-用于返回JS到浏览器,以作为对AJAX调用响应进行评估的模板。它们可以全部手动编写JS,但在其中放置Ruby让您可以插入来自程序其余部分的值。 - MattMcKnight

1

RJS很好,主要是因为它很容易集成到Rails项目中。为了保持简单和文件数量低,您可以将其嵌入控制器中,并且它具有来自prototype/scriptaculous库的许多易于使用的帮助程序。它感觉更像Ruby。

这意味着它与您的常规Rails代码没有那么清晰地分离,因为它很快就会与您的其他代码混合在一起。它还需要通过prototype和scriptaculous js文件包含许多外部库。

jQuery的一些东西非常干净。语法相当疯狂,但这意味着您可以完全将js从页面/控制器中删除(无侵入式js),这是一种更清洁/分隔的做事方式。

更重要的是,jQuery看起来像javascript。因此,您不会得到奇怪的javascript和Ruby代码混合。我喜欢Ruby。我不喜欢Javascript。但我更不喜欢两者的混合。如果您了解JS,则它会很熟悉。

Ryan Bates有一个关于将RJS转换为jQuery的视频教程。这可能会让你对两者在语法上的区别有一个很好的了解:http://railscasts.com/episodes/136-jquery


此外,jQuery看起来像JavaScript。因此,您不会得到JavaScript和Ruby代码的奇怪混合。这个论点是错误的。使用helpers,您不会在代码中得到JavaScript代码,而是得到:page.insert_html :bottom, 'list', content_tag("li", "Fox") - MattMcKnight
如果你是在为RJS进行辩护,那么这就是一个情况。但是如果我在为JS进行辩护,我不想要Ruby代码出现在我的JS中。仍然有很多情况,为了获得适当的JS功能,我最终使用JS而不是所有这些“helpers” 。这样会更容易。而且使用jQuery,我可以将它们全部移到我的Javascript代码中,并仅在必要时使用这些helpers。 - Lukas

1
如果你不熟悉JS(或者像Prototype这样的框架),但是你需要一个AJAX功能,那么RJS是最好的选择。使用RJS的另一个优点是速度快,编写RJS代码简单快捷。
我之前在所有的Rails项目中都使用过RJS。现在我更熟悉Prototype(和jQuery),这也是我现在编写JS代码的原因。我需要这样做,因为控制器中有很多RJS会降低其生产力。将RJS代码移到JS中是扩展控制器的第一步。
没有人能绝对地告诉你什么是最好的方法——使用RJS还是不使用。每个人都应该选择自己的方式。
例如,我更喜欢在我的应用程序的管理部分中使用RJS(不需要扩展),并为前端部分编写JS。

1

RJS并不是“邪恶”的,但我认为它存在两个问题:

  1. 使用RJS很难(甚至不可能)做到无侵入式JavaScript。如果你正在编写一个JavaScript重度应用程序,并且有很多逻辑,而且这些逻辑会发生变化,那么你将不得不更改相当数量的文件,而不仅仅是一个文件。此外,这是个人偏好,看到带有压缩JavaScript的标签散布其中相当丑陋。

  2. RJS抽象了JavaScript,这可能导致对语言的无知。 RJS背后的想法是使开发人员能够仅使用一种语言(Ruby)编写Web应用程序的所有内容(除了设计师可能处理的HTML和CSS),但实际上,这与通过拖放控件或使用大量生成代码向导来创建ASP.NET应用程序的方式类似,虽然可能,但不建议这样做。如果您只需要一个需要少量Ajax的简单解决方案,则RJS可以正常工作。

RJS是一个很好的工具,当你刚开始使用Rails并需要一些“快速而肮脏”的Ajax效果时,可以少量地使用它(例如,在同一页上淡入的博客的规范评论)。一旦你开始需要大量使用JavaScript,RJS就变成了更多的负担,因为它会屏蔽开发者应该尝试理解的东西。


最不显眼的 JavaScript 不就是你看不到的 JavaScript 吗? - MattMcKnight
回复:第二点。我认识很多开发人员,他们无法在不使用某种工具的情况下编写 Web 服务,或者在没有 IDE 的帮助下进行重构。我认为问题在于开发人员,而不是工具。 - Jeremy S

0

RJS是JavaScript版的RHTML(现在称为html.erb)。它是一个模板,执行嵌入式Ruby并返回JavaScript到浏览器以更新页面。这使您可以更好地控制在AJAX应用程序中作为服务器端操作结果发生的情况。实际上,RJS调用的结果由浏览器中的JavaScript解释器评估。与非RJS AJAX应用程序相比,其中服务器返回插入到异步请求回调中的HTML,这与之形成对比。

“邪恶”的部分是许多人不喜欢“eval”,但我认为这也可能是某种混淆的结果。

这里的许多响应似乎集中在JavaScript、Prototype和Scriptaculous Helpers上,这些通常被使用,但不是RJS模板的必要部分。我确实广泛使用这些助手,因为它们与模板中的Ruby代码更流畅,但它们不是RJS的必要部分。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接