Enter!バッチを起動しようと勢いよくキーを叩いたら、それはシフトキーだった。railsにおいて、特定のページでのみ実行するJavascriptが必要になることはよくあると思います。今回はassetsパイプラインのメリットを損なうことなく、それを実現するための方法を紹介します。『特定のページでのみ実行するJavascript』を実現するための方法とし、およそ次のようなパターンがあると思います。読み込むファイルを切り替える目的のページがどうかを判定してから処理を実行するようなJavascriptを書く1.は可能な限り避けられる方法です。Viewの中にJavascriptのソースが混在することになりますし、当然ながらassetsパイプラインの対象になりません。%>...当然ですがother_javascriptはapplication.jsの中で読み込まないように、つまりassetsパイプラインの管理外にする必要があります。結果的にproduction環境ではひとつのJSファイルにまとまらないので、その点はデメリットになります。2.はlayout/application.html.erbなんかで、読み込むJSファイルを切り替えてやる方法です。%>コントローラ名に合わせたJSファイルを用意しておけば、そのコントローラアクセス時に自動的に読み込んでくれます。幾分スマートなやり方に見えますが、本質的には1.の方法となんら変わりません。各コントローラ用のJSファイルはapplication.jsからはずしておく必要があります。(設定にもよりますが)コントローラ用JSファイルがないとproduction環境では500エラーになるので、特別な処理が必要でない場合も空のJSファイルを置いておかなければなりません。そこで3.の方法です。これは、すべてのJSファイルをapplication.jsの管理下に置くので、assetsパイプラインの恩恵を受けることができます。各JSでは特定のページかどうか判定し、そうでなかったら空振りさせるという塩梅です。判定処理が必要になるというデメリットもありますが、他の2つの方法よりはベターだと思うので、今回はこいつを実装してみたいと思います。実装どうやって特定のページかどうか判断するかは、コントローラ名・アクション名を使うことにします。application.html.erb(というかbodyタグを書いてるとこ)を編集します。%>">bodyのdata属性にコントローラ名とアクション名を付与するようにしました。ちなみにclassを使用する例もあるようですが、classはcssのためだけに使用し、JS用にはdata属性を使用するのがモダンだと思います。(jQuery流なので、いまさらモダンでもないけど・・・)続いて、特定のページを判定する共通の関数を作成します。0使い方はUsageの部分にも書きましたが、"コントローラ名#アクション名"という形式で第一引数を渡してやれば、そのページがロードされた後に第二引数のコールバック関数が実行されます。ここに処理を書くてな感じです。->をjqueryのreadyに書き換えればOKです。on_page_load.coffeeはgistにも置いてあるので良かったら使ってみてください。17:19色々な方法を見てきましたが、このやり方が一番スマートだと思います。17:27ありがとうございます。↑を満たす方法があればいいのですが...難しいですね。17:31おっしゃる通りだと思います。凝ったアプリだと、テンプレートを共用することがあると思うので、その場合はonPageLoadにアクションを列挙しなければなりません。「アセットパイプラインにまとめられる」これが一番理想的だとは思うのですが、renderメソッドをフックするとか、ちょっと凝ったことをしないと実現できないんじゃないかと思ってます。enough(十分に良い)」ではあるかなと思ってます。返信をキャンセルメールアドレスが公開されることはありません。名前*メール*サイト上に表示された文字を入力してください。コメントデータの処理方法の詳細はこちらをご覧ください。検索:プロフィールitmammothIT界のマンモスを目指しているフリーエンジニアです。麻婆豆腐/Ruby/Kotlin/麻婆春雨/Python好きです。最近カリフラワーも好きになりました。