LoginSignup
16
19

More than 5 years have passed since last update.

Haml内でCoffeeScriptを書くことの是非

Last updated at Posted at 2014-08-30

Rails 4 で Haml を導入したらテンプレ内に Cooffee 書けて俺得だった件 - Qiita

上の記事でHaml内でcoffeescriptを書くやり方が書いてありました。

hoge.html.haml
%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の最後で出力する

というのもおそらく有効だと思います。

hoge.html.haml
.iroiro
  %p いろいろな記述

-content_for(:javascript) do
  :javascript
    // いろいろな処理
view/layout/application.html.haml
!!!
%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ファイルにされるのか良くわからないのですが(たぶん前者?)、これはありねーという感じ。

16
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
19