Windows 8 で ExecJS::RuntimeError が出たときは

2013/01/08

この記事は『改訂新版 基礎Ruby on Rails』の読者サポートのために書かれたものです。
読者サポートページに戻る

類似の症状として「ExecJS::ProgramError: TypeError: オブジェクトでサポートされていないプロパティまたはメソッドです。」というエラーが出る場合があります。このエラーの対処法についてはWindows で ExecJS::ProgramError が出たときはこう直すをご覧ください。

Windows 8で書籍に従って作業を進めると、31ページで「ExecJS::RuntimeError in Top#index」というエラーに遭遇する可能性があります。

この場合は、以下の手順で execjs のソースコードを書き換えると問題が解消します。

  1. コマンドプロンプトを開き、C:¥rails¥asagao フォルダに移動します。
  2. bundle show execjs コマンドを実行し、execjs がインストールされたフォルダのパスを調べます。C:/Ruby193/lib/ruby/gems/1.9.1/gems/exejs-2.0.1 あるいは C:/Ruby200/lib/ruby/gems/2.0.0/gems/exejs-2.0.1 のように表示されます。2.0.1 の部分は環境により異なります。
  3. Windows のエクスプローラで execjs のインストールフォルダから libexecjs とサブフォルダを開きます。
  4. runtimes.rb のバックアップを取ります。※ 単数形の runtime.rb というファイルと間違えないでください
  5. 適当なテキストエディタで runtimes.rb を開き、次のように書き換えます。

書き換え前: (execjs-2.0.2 の場合は41-46行目)

    JScript = ExternalRuntime.new(
      :name        => "JScript",
      :command     => "cscript //E:jscript //Nologo //U",
      :runner_path => ExecJS.root + "/support/jscript_runner.js",
      :encoding    => 'UTF-16LE' # CScript with //U returns UTF-16LE
    )

書き換え後:

    JScript = ExternalRuntime.new(
      :name        => "JScript",
      :command     => "cscript //E:jscript //Nologo",
      :runner_path => ExecJS.root + "/support/jscript_runner.js",
      :encoding    => 'UTF-8'
    )

変更箇所:

  1. 3行目の //U を削除。
  2. 5行目の UTF-16LEUTF-8 に変更。コメントを削除。

asagao アプリケーションを起動し直してから、動作確認してください。

64bit 版の Windows をお使いの方は、64bit 版の Windows で画面が真っ白になる場合(sqlite3 の問題)も合わせてお読みください。

[更新] 従来は node.js をインストールするようにお勧めしていましたが、stackoverflow への投稿により、execjs のソースコードを書き換える方法を採用しました。(2013/09/14)

[更新] Stackoverflow の投稿が更新されたのを受けて、3行目の //U を削除するように変更しました。また、5行目の UTF-16LEUTF-8 に修正することにしました。以前は UTF-16LE から LE を削除するという手順でした。(2013/12/18)

[更新] 別の記事「Windows で ExecJS::ProgramError が出たときはこう直す」を紹介する注釈を記事の冒頭に加えました。(2015/07/29)