2649


Ruby on
Railsでcooffeeスクリプトをいくつか書くと、それらはアセットパイプラインで一つのスクリプトにまとめられて、javascript_include_tagを仕込んでおけばOKとなると思うんですが、
そこそこややこしい事やってるからcoffeescriptで書きたい、だけど量は多くない、だからスクリプトを読み込むリクエストがもったいない事になっている、という状況のとき、
コンパイルしたjavascriptを直接HTMLに埋め込む事って出来るんでしょうか？ もしそれができるのならcssでも同じことが出来るんですかね？

まあ遅延読み込み使えとか、javascriptくらい手書きしろ、っていうのはあると思うんですが、
もしかしてjavascript埋めこもうとしたらjQueryで大変な事になるとかもありますかね？

--追記

話がややこしくなりそうなので、jQueryもひっくるめて埋める、ということにしたいと思います。
coffeescriptのコンパイル結果がjQueryを使わないようにする等の話はまたの機会にするとして、ここではコンパイル済みのjavascriptを`<script
type="text/javascript">`として埋め込めるかの話に限定させて下さい。


CC BY-SA 3.0
2014-12-26T11:00:32.400
2640
2014-12-26T16:31:52.427
2014-12-26T13:30:38.277
705
705
question
ruby-on-rails
Ruby on RailsでHTMLにjavascriptを直接埋め込む方法


いまでも動くかわからないですが [CoffeeBeans](https://github.com/markbates/coffeebeans) っていうのが
Rails 3.1 時代にあったみたいです。 ソースを見ると、複雑なことはしていないので、
仮に最新のRubyで動かなくても、比較的容易に修正&移植できるように感じました。

CoffeeBeans を使うと

[code]

    <%= coffee_script_tag do %>
      alert 'coffee script is awesome!'
    <% end %>
    
[/code]

こんな風に書けるらしいです。

* * *

### 追記: 仕組み解説

`<%= coffee_script_tag do %>` ってのはただの `View` のメソッド呼び出しです。
メソッドを呼び出してその戻り値の文字列で、 `<% end %>` までを置き換えてくれます。

で、このメソッドですが
[ココ](https://github.com/markbates/coffeebeans/blob/master/lib/coffeebeans.rb#L19-L21)
で定義されています。 あとは普通にタグ間の文字列を `capture(&block)` して、 CoffeeScript として JS
へコンパイルしていますね。 なお `coffee_script_tag` メソッドが `View` に生えているのは、
[ココでinclude](https://github.com/markbates/coffeebeans/blob/master/lib/coffeebeans.rb#L32)
しているから、となります。

コンパイルが実行されるタイミングとしては、 このタグが書かれたテンプレートがHTMLとしてレンダリングされる時です。 つまりリクエストがあるたびに毎回
CoffeeScript をコンパイルすることになるので、 普通に assets としてコンパイルする場合よりも、
当然遅くなる(サーバの負荷は上がる)でしょう。

個人的には、普通に assets とするほうが良いとは思いますが、参考まで。


CC BY-SA 3.0
2014-12-26T14:52:52.527
2647
2014-12-26T16:21:20.360
2014-12-26T16:21:20.360
208
208
2640
answer


View
側でコンパイルされたJSを埋め込むことで実現可能です。Railsのプリコンパイルの仕組みに乗っているので、Javascript/CoffeeScript
いずれの場合でもそのまま動きますし、require すれば jQuery も埋め込めます。

[code]

    <script type="text/javascript">
      <%= raw Rails.application.assets["moemoe.js"].to_s %>
    </script>
    
[/code]

以下の点にご注意ください。

  * config/application.rb で、"moemoe.js" をコンパイル対象に指定する必要がある: `config.assets.precompile << "moemoe.js"`
  * application.js 側で、require_tree を無効にしておかないと二重に読み込まれる


CC BY-SA 3.0
2014-12-26T15:55:16.443
2649
2014-12-26T16:31:52.427
2014-12-26T16:31:52.427
76
76
2640
answer