【Rails】ページをリロードしないとJavaScriptが実行されない時の対処法
困ったこと
application.js
にて、簡易な処理をjQueryで記述していた。直接そのページのURLを叩いてアクセスするともちろんその処理が実行される。
しかし下記の場合になぜか実行されないという事態に陥った。
- 同アプリ内から
a
タグをクリックし遷移した時 redirect_to
でリダイレクトしてきた時
解決法
turbolinks:load
というイベント発生時に実行するように修正したら解決。
原因
原因はコードにもある通り「Turbolinks」だった。
Turbolinksはリンクをクリックした時にページ全体を読み込むのではなく、head
タグの一部とbody
タグ内の要素だけを書き換え、読み込みの高速化をしてくれるライブラリ。(Rails独自のものではない)
それが有効化されていたことにより、書き換え対象に含まれないjsの処理が実行されなかった。(ちなみにRails4からデフォルトのGemになったらしい)
参考:Rails で JavaScript を利用する - Railsガイド
Turbolinksを無効にする方法
Turbolinksの恩恵を受けられず読み込み速度は落ちるが、無効にする方法もある。
1. Turbolinksをアンインストール
Gemfile
の該当箇所を消す、もしくはコメントアウトする。
を叩く。
2. application.jsの記述を修正
application.js
における上の行を削除する。
3. application.html.erbを修正
あとはhead
タグ内のこの記述を削除してあげれば、Turbolinksの無効化が完了。