私はこのパーティーに少し遅れて来ることに気づきましたが、私が最近使用しているソリューションを投入したかったのです。ただし、最初に触れさせてください...
Rails 3.1 / 3.2 Way(いいえ、私はそれが好きではありません。)
参照:http : //guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
私はこの回答に完全を期すために以下を含めています。それは実行不可能な解決策ではないので...あまり気にしませんが。
「Rails Way」は、この質問の元の著者が要求したようにビュー指向ではなく、コントローラー指向のソリューションです。それぞれのコントローラーにちなんで命名されたコントローラー固有のJSファイルがあります。これらのファイルはすべて、デフォルトではapplication.jsのrequireディレクティブに含まれていないフォルダーツリーに配置されます。
コントローラ固有のコードを含めるには、ビューに次のコードを追加します。
<%= javascript_include_tag params[:controller] %>
私はこの解決策を嫌っていますが、それはそこにあり、迅速です。おそらく、代わりにこれらのファイルを「people-index.js」や「people-show.js」のような名前で呼び出し"#{params[:controller]}-index"
、ビュー指向のソリューションを取得するようなものを使用できます。繰り返しになりますが、すぐに修正できますが、うまく対応できません。
私のデータ属性方法
クレイジーと呼んでも、デプロイするときにすべてのJSをコンパイルしてapplication.jsに縮小したい これらの小さなstragglerファイルをあちこちに含めることを覚えておく必要はありません。
私はすべてのJSを1つのコンパクトなブラウザーにキャッシュされるファイルにロードします。私のapplication.jsの特定の部分をページで起動する必要がある場合は、RailsではなくHTMLに通知させます。
JSを特定の要素IDにロックしたり、マーカークラスでHTMLを散らかしたりするのではなく、というカスタムデータ属性を使用しますdata-jstags
。
<input name="search" data-jstag="auto-suggest hint" />
各ページで、使用するJSライブラリメソッドをここに挿入して、DOMの読み込みが完了したときにコードを実行します。このブートストラップコードは、次のアクションを実行します。
- でマークされたDOM内のすべての要素を反復処理します
data-jstag
- 要素ごとに、属性値をスペースで分割し、タグ文字列の配列を作成します。
- タグ文字列ごとに、そのタグのハッシュで検索を実行します。
- 一致するキーが見つかった場合は、それに関連付けられている関数を実行し、要素をパラメーターとして渡します。
したがって、application.jsのどこかに次のように定義したとします。
function my_autosuggest_init(element) {
/* Add events to watch input and make suggestions... */
}
function my_hint_init(element) {
/* Add events to show a hint on change/blur when blank... */
/* Yes, I know HTML 5 can do this natively with attributes. */
}
var JSTags = {
'auto-suggest': my_autosuggest_init,
'hint': my_hint_init
};
ブートストラップイベントは、検索入力に対してmy_autosuggest_init
とmy_hint_init
関数を適用し、ユーザーが入力しているときに候補のリストを表示する入力に変換し、入力が空白でフォーカスされていない場合に何らかの入力ヒントを提供します。
一部の要素がでタグ付けされていない限りdata-jstag="auto-suggest"
、自動提案コードは実行されません。しかし、それは常にそこにあり、縮小され、最終的に私のapplication.jsにキャッシュされます。
タグ付けされたJS関数に追加のパラメーターを渡す必要がある場合は、いくつかの創造性を適用する必要があります。data-paramter属性を追加するか、ある種のパラメーター構文を考え出すか、ハイブリッドアプローチを使用します。
コントローラー固有の複雑なワークフローがある場合でも、そのためのファイルをlibフォルダーに作成し、application.jsにパックして、「new-thing-wizard」などのタグを付けます。ブートストラップがそのタグに当たると、素敵で豪華なウィザードがインスタンス化されて実行されます。必要なときにそのコントローラーのビューに対して実行されますが、それ以外の場合はコントローラーに結合されません。実際、ウィザードを正しくコーディングすれば、すべての構成データをビューに提供できるため、ウィザードを必要とする他のコントローラーに後で再利用できる可能性があります。
とにかく、これは私がしばらくページ固有のJSを実装してきた方法であり、単純なサイト設計とより複雑でリッチなアプリケーションの両方に役立ちました。私がここで紹介した2つのソリューションのうちの1つ(私の方法またはRailsの方法)が、将来この問題に遭遇した人にとって役立つことを願っています。