たくさんのレール開発者がRJSは悪だと言っているのを聞いた。私はいつも古典的なjavascriptまたはjqueryを使用してやりたいことを何とかしていたので、それを使用したことがないので、注意を払っていませんでした。今、私はいくつかのレガシーコードに取り掛かっていて、RJSがいたるところにあります。
それで...それは本当ですか?RJSを使用することの欠点/利点は何ですか?
たくさんのレール開発者がRJSは悪だと言っているのを聞いた。私はいつも古典的なjavascriptまたはjqueryを使用してやりたいことを何とかしていたので、それを使用したことがないので、注意を払っていませんでした。今、私はいくつかのレガシーコードに取り掛かっていて、RJSがいたるところにあります。
それで...それは本当ですか?RJSを使用することの欠点/利点は何ですか?
RJS が悪であるかどうかに入る前に、RJS とは何かについて話しましょう。
RJS は、ActiveRecord が SQL 用に提供する高機能 Javascript ライブラリに同じレベルの抽象化を適用します。ただし、Javascript ライブラリの RJS カバレッジは、ActiveRecord の SQL アダプタのカバレッジほど完全ではありません。
Rails には、Prototype/Script.aculo.us のみの RJS サポートが付属しています。ただし、他の Javascript ライブラリをサポートするプラグインが利用可能または開発中です。たとえば、JRails は Prototype ベースのヘルパーを書き直して、jQuery で動作するようにします。mootools やおそらく Dojo にも同様のプラグインが存在します。
RJS を悪と見なす人々は、一般に、プロトタイプ コードを作成することに慣れていないか、生の Javascript を使用した方が簡単に物事を達成できると感じている人々です。
ActiveRecord が完全ではないのと同様に、RJS も完全ではありません。仕事を成し遂げるために生の Javascript や SQL を書かなければならないことがよくあります。繰り返しになりますが、ActiveRecord と同様に、高度なオプションに慣れれば慣れるほど、生のコードを書かなくてもより多くのことを達成できます。
RJS の素晴らしい点の 1 つは、RJS が本質的にビューであり、Javascript を生成することです。コントローラーへの応答として、またはページに含まれるカスタム Javascript 関数の一部として、必要に応じて含めることができるパーシャルに RJS を抽出するのは非常に簡単です。これにより、コードがより DRY になり、メンテナンスが簡単になります。
個人的にはRJSをよく使います。一度に多数の DOM 要素に触れるのに最適な方法だと思います。Javascript をあまり書かなくても、AJAX リッチなサイトを作成できるという二重の利点があります。繰り返しになりますが、私は Javascript を書くのが嫌いです。
Rails プロジェクトで Prototype の基礎となるライブラリを JQuery に置き換えたことを考えると、RJS が非常に便利であることがわかりました。現在、JavaScript をサーバーに戻して実行することは、まだ完全に主流ではないため、面倒な場合があります。
ただし、一般的には RJS に問題はありません。私が持っている唯一の不満は、通常、RJS とプレーンな古い Javascript の両方を .rjs ファイルに混在させる必要があることです。そのため、少し無意味です。しかし、Javascript の効果と AJAX 呼び出しを処理するためのクリーンな場所/方法が得られるので、「コードを配置する標準的な場所」として、非常に優れていると思います。
悪口を言うかどうかはわかりませんが、RJS (または JS を生成するサーバー側言語) は私の最初の選択肢ではありません。私はJSを手で書くことを好みます。jQuery を使用して、私は実際に JS を書くことを楽しんでおり、自分の JS を application.js に保持することは単純にクリーンな感じがします。
少し拡張すると... RJSは不要な抽象化だと思います。JavaScript と jQuery について知りたいです。DOM の操作方法と AJAX 呼び出しの方法を知りたいです。また、JS/jQuery の知識があれば、別の フレームワークに簡単に移行でき、そのフレームワークが私の JS を処理してくれるかどうか疑問に思うことはありません。
JS (または Prototype のようなフレームワーク) に慣れていないが、AJAX 機能が必要な場合は、RJS が最適です。RJS を使用するもう 1 つの利点は、速度です。RJS コードを簡単かつ迅速に記述します。
以前はすべての Rails プロジェクトで RJS を使用していました。Prototype (および jQuery) に慣れてきたので、JS コードを書くようになりました。これが必要なのは、RJS が多いコントローラーが生産性を失ったためです。RJS コードを JS に移行することが、コントローラーをスケーリングするための最初のステップでした。
RJSを使用するかどうかにかかわらず、何が最善の方法であるかを絶対に言うことはできません。誰もが自分の道を選ぶべきです。
たとえば、アプリの管理部分 (何もスケーリングする必要がない場所) で RJS を使用し、フロントエンド部分に JS を記述します。
RJS は「悪」ではありませんが、2 つの問題があると思います。
RJS で目立たない JavaScript を実行するのは困難 (不可能?) です。Javascript を多用するアプリケーションを作成していて、多くのロジックがあり、そのロジックが変更された場合、1 つだけではなくかなりの数のファイルを変更する必要があります。また、これは個人的な好みですが、圧縮された Javascript が点在するタグを見るのはかなり醜いです。
RJS は Javascript を抽象化しますが、これは言語の無知につながる可能性があります。RJS の背後にあるアイデアは、開発者が Ruby という 1 つの言語だけを使用して (おそらくデザイナーが取り組む HTML と CSS を除いて) Web アプリケーションのすべてを記述できるようにすることでしたが、実際にはこれも同じように不十分です。コントロールをドラッグ アンド ドロップするか、大量のコードを生成するウィザードを使用して、ASP.NET アプリケーションを作成することは可能ですが、お勧めしません。必要なのは、Ajax のスプリンクを必要とする単純なソリューションだけである場合、RJS は問題なく機能します。
RJS は、Rails を使い始めたばかりで、控えめに使用される「手早く汚い」Ajax 効果が必要な場合に適したツールです (たとえば、同じページにフェードインするブログの正規のコメントなど)。Javascript を大量に使用する必要が生じ始めると、RJS は開発者が本当に理解しようとするべきことから保護されてしまうため、より不利になります。
RJS が優れているのは、主に Rails プロジェクトに簡単に統合できるためです。物事をよりシンプルに保ち、ファイル数を少なく保つために、それをコントローラーに埋め込むことができます。また、prototype/scriptaculous ライブラリーからの使いやすいヘルパーがたくさんあります。よりRubyらしい感じです。
これは、通常の Rails コードからきれいに分離されていないことを意味します。コードの残りの部分とすぐに混ざってしまうからです。また、prototype および scriptaculous js ファイルを介して、さらに多くの外部ライブラリを含める必要があります。
jQuery の一部は非常にクリーンです。構文は非常にクレイジーですが、それは、js をページ/コントローラー (目立たない js) から完全に引き出すことができることを意味します。
さらに、jQuery は JavaScript のように見えます。そのため、JavaScript と Ruby コードの奇妙な組み合わせは得られません。ルビーが好きです。私はJavascriptが好きではありません。しかし、私は2つのミックスがさらに好きではありません. JS を知っていれば、なじみのあるものに見えるでしょう。
Ryan Bates が、RJS から jQuery への変換に関するスクリーンキャストを公開しています。構文的に2つの違いをよく理解できるかもしれません:http://railscasts.com/episodes/136-jquery
RJS は、JavaScript で RHTML (現在は html.erb として知られています) に相当するものです。埋め込まれたRubyを実行し、ブラウザにJavaScriptを返してページを更新するテンプレートです。これにより、AJAX アプリケーションでのサーバー側のアクションの結果として何が起こるかをより細かく制御できます。実際には、RJS 呼び出しの結果は、ブラウザーの JavaScript インタープリターによって評価されます。これを、非同期要求のコールバックによってページに挿入された HTML をサーバーが返す非 RJS AJAX アプリケーションと比較してください。
「悪」の部分は、多くの人が「eval」に不快感を覚えるということですが、それはある種の混乱の結果でもあると思います。
ここでの回答の多くは、RJS テンプレートの一部として頻繁に使用されますが必須ではない JavaScript、Prototype、および Scriptaculous Helpers に焦点を当てているようです。これらのヘルパーは、テンプレート内の Ruby コードとの相性が良いため、幅広く使用していますが、これらは RJS の必須部分ではありません。