Rails
ExecJS

RailsのScaffold後、rails sしてブラウザアクセスするとExecJS::RuntimeError in Users#index

More than 3 years have passed since last update.

ドットインストールでRailsの勉強していますが、#04 Scaffoldを使ってみようで早速つまづいた。

ローカルの環境はMac+rbenvで構築したもの

エラー内容は以下のようなもので、途中のトレースは省略


  • Showing /Users/{user_name}/Development/dotinstall-lesson/tryapp/app/views/layouts/application.html.erb where line #6 raised:

で、最後は


  • in /Users/{user_name}/.rbenv/versions/2.1.2/lib/ruby/gems/2.1.0/gems/turbolinks-2.3.0/lib/assets/javascripts/turbolinks.js.coffee


scafold_app/app/views/layouts/application.html.erb

<head>

<title>DotinstallLesson</title>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
<%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
<%= csrf_meta_tags %>
</head>

とある。

検索すると、いくつか解決策らしきものが出てくるけど、根本原因がよくわからない、Windowsだと発生するみたいな情報もあるけど、こちらはMacな環境

上記では、execjsのソース?を編集するということだけど、なんかそれは違う気がする

そのほかだとExecJSをgemでインストールし直したら、うまくいった、みたいなものもある

ExecJSがちゃんと読み込まれていないとか、そういう話?

もう少し色々見て行くと、冒頭に書いたScaffoldで自動生成されたテンプレートファイルを編集すると直る的なことが書かれている

そもそもExecJSが動く際にサポートしているJSのエンジンruntimeがないってことかもしれない...


ExecJS lets you run JavaScript code from Ruby. It automatically picks the best runtime available to evaluate your JavaScript program, then returns the result to you as a Ruby object.

ExecJS supports these runtimes:

therubyracer - Google V8 embedded within Ruby

therubyrhino - Mozilla Rhino embedded within JRuby
Node.js
Apple JavaScriptCore - Included with Mac OS X
Microsoft Windows Script Host (JScript)

Mac環境下でも、Apple JavaScriptCoreをサポートしているっぽいけど、ローカル環境はHomebrewやrbenvで構築しているから、各ライブラリ間の参照関係とかが上手くリンクしていないのかもしれない?

ということで、brew listで確認したけど、ちゃんと入っているぞ

$ brew list

ansible git libyaml pkg-config ruby
autoconf libgpg-error node rbenv ruby-build
gdbm libksba openssl readline

当然、node -vwhich nodeも返ってくる

$ node -v

v0.10.1
$ which node
/usr/local/bin/node

結果、Gemfileを編集して、gem 'execjs'を追記してbundle installしてみたが、それでは上手くいかず、テンプレートファイルを編集して、javascript_include_tag 'application'javascript_include_tag 'defaults'にしたらエラーは解決した

ちなみに、defaultでも「s」のついたdefaultsでも、どちらでも上手く行った... なぜ?

javascript_include_tag'application', 'defaults'あたりを調べれば、根本的なことがわかるかな... 取り敢えず、レッスンを続けたいので、このエラーに再会したらまた調べる

以下、ちょっと調べた時に出てきたもの、関係あるかな?

[追記 09/07, 2014]

分かったかも、rails sしてhttp://localhost:3000/にアクセスして、"About your application’s environment"にアクセスすると"JavaScript Runtime Node.js(V8)"とある

"V8"は、"therubyracer - Google V8 embedded within Ruby"の"V8"だろうから...

結果、テンプレートのjavascript_include_tag'application'のままで、アプリ直下のGemfileを編集して、コメントアウトされていたgem 'therubyracer', platforms: :rubyを有効にして、bundle installして、therubyracer以外もいくつかインストールされて、うまく動くようになった

Installing libv8 3.16.14.3

Installing ref 1.0.5
Installing therubyracer 0.12.1