Rails 4 で Haml を導入したらテンプレ内に Cooffee 書けて俺得だった件 - Qiita
上の記事でHaml内でcoffeescriptを書くやり方が書いてありました。
%a.hoge
:coffee
$('.hoge').on 'click', ->
window.location = #{hoge_path(@user)}
こう書くことで、Hamlの中にCoffeeScriptを書けて便利、という記事で、確かによく使います。
が、いくつか落とし穴もあるよー、っていうことに遭遇しているので、それをまとめてみました。
HamlにCoffeeScriptを記述する利点
- 外部ファイルにするまでもない数行のスクリプト(ページ読み込み完了時に特定の
display: none;
を解除とか)を気軽に書ける。 - javascript内にrailsのControllerで作った変数やPathHelperメソッドを埋め込めこめる
HamlにCoffeeScriptを記述する欠点
-
hoge.html.haml
のロードのたびに記述したCoffeeScriptがコンパイルされる- コンパイルのオーバーヘッドは大したことがない
- しかしコンパイルに使われるライブラリ(主にTheRubyRacer)やその依存Gemのバグで謎のエラーに悩まされたり……
- 記述したスクリプトはminifyされない(大したデメリットじゃないですが)
- そもそもページの途中に
<script>
タグを埋め込むのは、HTMLのベストプラクティス的にあまりおすすめじゃない
結論
ほんとにHaml内にCoffeeScript記述する必要ある?って考える
- 数行の小さいスクリプト
- どうしてもRailsで作成した変数を埋め込みたい
... って時だけ使い、そうでない時は外部ファイルにする
また
-
:coffee
ではなく:javascript
で記述する。後者の場合、<script>
タグで囲む処理だけが走る(coffee->jsへのコンパイルがない)のでExecjsやTheRubyRacerのバグに引っかからない。 -
content_for
を使い、layout/application.htmlの最後で出力する
というのもおそらく有効だと思います。
.iroiro
%p いろいろな記述
-content_for(:javascript) do
:javascript
// いろいろな処理
!!!
%html
%head
%title ページ
%body
%section.main
= yeild
%section.note このページは○○によって作られたとかなどの情報
-if content_for?(:javascript)
= yield(:javascript)
参考
cowboyd/therubyracer#176 - Github
「なんかmethod `method_missing' called on terminated object
ってエラーが起きたよ」
「あ、それRuby2にすれば治るよ」
「業務システムでアップグレードをすぐにするとか無理だよ…」
というやりとり。
cowboyd/therubyracer#270 - Github
「TheRubyRacerってスレッドセーフじゃなくね?」というIssue
追記
「Hamlにcoffee書く必要のあるときはどんな時か」というのに「どうしてもRailsで作成した変数を埋め込みたい」を書きましたが、
人から「単純にpath_helperを埋め込みたいだけとかなら、js.coffee.erb書くっていう手もあるよ」と教わりました。
この場合、アクセスのたびにコンパイルされるのか、それともprecompile時にjsファイルにされるのか良くわからないのですが(たぶん前者?)、これはありねーという感じ。