Rails3.1 の asset pipeline を production 環境で使うと、マニフェストに書いたルールにしたがって複数の同種リソースを一つにまとめてくれます。これはリクエスト数の削減やレスポンスの圧縮などに寄与しており非常に有益な仕組みなのですが、マニフェストの書き方によっては、そのシーンでは使わないようなファイル、あるいは実行してほしくないファイルもレスポンスで含まれてしまうことがあるため、たとえば javascript においては現状だと下記いずれかのアプローチを取るのがよいのかなと考えています。
すべて読み込んで js 側で処理を dispatch する
特になにも考えず、必要なリソースをマニフェストに書いておきます。そして js 内で location.pathname あたりをもとに実行する処理を振り分けるような薄いフレームワークを用意し、URL ごとに対応するのがいいでしょう。
dispatcher は下記の記事が参考になるかなーと思います。
http://tech.kayac.com/archive/javascript-url-dispatcher.html
所詮はテキストだし minify されるし gzip すれば大した大きさにはならないし、という前提で納得できる人はこれでいいのではないでしょうか。
必要なファイルのみ読み込むようにする
幸いなことにコントローラ単位でリクエストする方法があって
javascript_include_tag params[:controller]
こう書けば javascripts/[コントローラ名] をまとめられたファイルとは別に呼ぶことができます。リクエストはひとつ増えますが、前述の方法とどっちが効率いいかはリソースの内容などによって異なるでしょう。
ただしこれは実態の有る無しを考慮していないので、すべてのコントローラに対応した js を用意しておくか、あるいは helper など一枚噛ませて実態が存在するかを判断して出力するようにする必要があるでしょう。404 になってもいいぜっていう男気あふれる人は気にせず前進してください。
もちろん production 環境においてそれぞれのリソースは precomplile されている必要があるかと思いますので
config.assets.precompile += %w(*.css *.js)
(ざっくりとですが)こんな感じで config に書いておくといいでしょう。
あと routes.rb でコントローラ名を隠蔽している場合(パスとコントローラ名が一致しない場合)、リクエストしているファイル名からコントローラ名がわかってしまうという点も人によっては嫌かなーと。これもちょっとした工夫が必要ですね。
まとめ
コントローラ単位で必要な js を用意しておいて、それぞれの js の中で location.pathname 単位の dispatch をするのが無難かなという感じです。もっといい方法があれば知りたいところ。