Tag: Rails/トラブルシューティング

目次

関連ページ

参考情報

Bundler関連

「Can't find gem bundler (>= 0.a) with executable bundle」エラー

  • 2019/01/24(木)現在、bundle installで以下のようなエラーが発生。
    Can't find gem bundler (>= 0.a) with executable bundle (Gem::GemNotFoundException) 
  • Bundler: An update on the Bundler 2 releaseによるとBundler 2.0がリリースされたことにより、新しくRubyをインストールした環境ではbundler 2.0がインストールされてしまい、既存の環境と互換性がなくなっていることが原因らしい。
  • 以下のようにBundler 1.x系の最新版をインストールしておく。
    gem install bundler -v '1.17.3'

Macでlibv8/therubyracerをインストールしようとしてエラー

参考情報

現象

  • 環境はOS X El CapitanとRubyのバージョンは2.2.4。
  • Gemfileの指定。
    gem 'therubyracer', '0.12.1'
    gem 'libv8', '3.16.14.7'
    
  • 「mkmf.rb:1702:in `dir_config': undefined method `split' for true:TrueClass (NoMethodError)」といったエラーが表示される。
  • libv8はインストールできるのだが、therubyracerがどうしてもだめ。
  • apple-gccをインストールする方法が提唱されているがこれはやりたくない。

解決

  • Gemfileの指定を以下のように変更。
    gem 'therubyracer', '0.12.1'
    gem 'libv8', '3.16.14.11'
    
  • このあと「bundle update」しないとだめなので注意。gem 'libv8', '3.16.14.13'だとだめかも。
  • 今後のことを考え検証用のデモプロジェクト「ruby-therubyracer-demo」を作成した。

We're sorry, but something went wrong.

  • 画面に表示された場合、アプリログを確認する(log/production.log)。それを見れば代替原因が分かる

Uncaught exception: Specified 'mysql2'…(2015/10/28)

  • 正確には以下のようなエラーが発生する
     Uncaught exception: Specified 'mysql2' for database adapter, but the gem is not loaded. Add `gem 'mysql2'` to your Gemfile
  • mysql2 gem v0.4.0 doesn't work · Issue #21544 · rails/railsによると、Gemfileでmysql2のバージョンを指定すれば良いらしい。
    gem 'mysql2', '~> 0.3.18'
  • Rails 5.1.5でも発生した。その場合いかのように指定。
    gem 'mysql2', '>= 0.3.18', '< 0.5'

gitでブランチを作成してmergeしようとするとコンフリクトする

モデル

モデルのコレクションクラスでcountが動作しない

コントローラー

コントローラーのメソッドが呼ばれない

  • コントローラーのメソッドがprivateになっていないか注意。
  • privateを上の方に追加するとそれ以降privateとみなされてしまう。

ビュー

レイアウトが適用されない

  • コントローラーでinitializeをオーバーライドしていないか確認。
  • initializeする場合、以下のようにsuperを呼び出さないとレイアウトが呼ばれなくなるなどの不具合が発生する。
    def initialize
       super
     # 初期化処理
    end
    
    

一般

プロダクション環境で全く動かない

  • サーバーを再起動してもエラー画面だけ表示されて一切動いている気配がない場合
  • apacheのログなどみても何もわからない場合デバッグ表示を有効にしないといけないかもしれない。
  • めんどくさい場合まずはじめにMySQLが動いているかどうか確認する。
  • MySQLが動いていないと当然Railsも動かない。

プロダクション環境でルートページが表示されない(Rails5.1)

  • http://localhost:3000で「The page you were looking for doesn't exist.」が表示される。
    The page you were looking for doesn't exist.
    You may have mistyped the address or the page may have moved.
    
  • エラーメッセージを確認すると「ActionController::RoutingError (No route matches [GET] "/")」。
  • 文字通りルーティングが設定されていないのが原因。development環境ではwelcomeにルーティングが設定されているのだがproduction環境では設定されていない。自力でroutes.rbにルーティングを設定するしかない。
  • public/index.htmlを表示させたい場合はprouction.rbを変更する
    config.public_file_server.enabled = true

プロダクション環境で「Could not find a JavaScript runtime」

  • rails sコマンド実行時に「Could not find a JavaScript runtime.」とエラーが出る場合の対処法 - Qiita
  • 本番環境でassets:precompileタスクを実行するときに発生するらしい。
  • そのときに使われるExecJSはtherubyracerやnodejsなどいくつかのJavaScriptランタイムを検索して使用する(どれかがあれば良い)。
  • therubyracerはコンパイル時にエラーがでることが多いので、nodejsをインストールすれば良い(/usr/bin/node)。
  • CentOS 6の場合epelのをインストールする。
    sudo yum install nodejs --enablerepo=epel
  • これだけだと以下のようなエラーが表示されるかもしれない。
    node: error while loading shared libraries: libuv.so.0.10: cannot open shared object file: No such file or directory
  • nodejsにlibuvへの依存関係が漏れているらしいのでlibuvもインストールする
    sudo yum install  libuv

プロダクション環境で画像が表示されなし

  • assetのコンパイルをしない場合以下のように設定する
      config.serve_static_files = true
      config.assets.compile = true
    

DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role

  • development.rbで「config.serve_static_assets = true」を「config.serve_static_files = true」に変更。

クラス名が衝突する

  • Ruby一般の場合自作クラスをmoduleを使ってネームスペース内に格納するのが定石。
  • ただしRailsの場合モデル名を自由にmodule内に入れることができないかもしれない。
  • 無理矢理するなら以下のような方法が使える?My class name conflicting with Ruby's - Stack Overflow
    module Mymod
      require 'date'
      RubyDate = Date
      Date = nil      
      class ClassA
        class Date < Mymod::ClassA
          def initialize
            today = RubyDate.today # get today's date from Ruby's Date class
            puts "Today's date is #{today.to_s}"
          end
        end
      end
    end
    
    Mymod::ClassA::Date.new # => Today's date is 2014-01-05
    
  • まあ素直にモデル名を変更したほうが良いかもしれない。モデル名をあまり一般的すぎる名前にするのはやめたほうがよさそう。

デバッグ時にlib以下のクラスが自動リロードされない

  • 基本的にconfig.rbに以下の設定を追加しておれば、Railsでは毎回クラスがリロードされるはず。
    config.autoload_paths += Dir["#{Rails.root}/lib"]  # 追加
  • これがうまくいかない場合lib以下の.rbファイルで独自にrequireしていなか確認。requireしたファイルはRailsの自動ロード機能が有効にならない模様。

プロダクション環境でlib以下のクラスが自動リロードできない

  • 例えばバッチ処理を実行しようとすると以下のエラーが表示される。
    uninitialized constant Tasks (NameError)
  • 原因はRails 5でlibのオートロードの設定が変わったため。以下のようにeager_load_pathsも設定すれば良いらしい。
       config.autoload_paths += Dir["#{Rails.root}/lib"]  
       config.eager_load_paths += Dir["#{Rails.root}/lib"]

Circular dependency detectedエラーが発生

  • マルチスレッド環境でRailsのautoloadがうまく働かないのが原因。
  • require_dependencyで必要なファイルを手動ロードするのが良い(requireしてしまうとデバッグ中に変更が反映されてなくなってしまうので注意)。外部ファイル読み込み時の「require」と「require_dependency」の違い - Qiita
  • lib関連ならばeager_load_pathsを追加するのもいいかもしれない。
    config.autoload_paths += Dir["#{Rails.root}/lib"]  
    config.eager_load_paths += Dir["#{Rails.root}/lib"]

macOS Sierra対策

rmagickがインストールできない

nokogiriがインストールできない

  • システムライブラリを使わないとだめっぽい。
    export NOKOGIRI_USE_SYSTEM_LIBRARIES=1
    bundle config build.nokogiri --use-system-libraries=true --with-xml2-include=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.12.sdk/usr/include/libxml2
    

ld: library not found for -lssl

全般設定

  • therubyracer、rmagick、nokogiriのバージョン指定を外す。
  • libv8は直接指定しない。

macOS Sierraの古い情報

../src/scanner.h:444:5: error: unused typedef '__StaticAssertTypedef__444

  • macOS Sierra環境で発生。libv8のバージョンを固定していたのが原因か?Gemfileからlibv8の行自体を削除してみる。

Don't know how to set rpath on your system, if MySQL libraries are not in path mysql2 may not load

  • linking shared-object mysql2/mysql2.bundle
  • macOS Sierra環境で発生。RailsプロジェクトでMySQLがbundle installできなかった - Qiitaが参考になる?
    $ bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
  • もしくは以下のコマンドでもいいらしい
    xcode-select --install

Can't install RMagick 2.13.4. Can't find MagickWand.h

Nokogiriがインストールできない

  • ERROR: cannot discover where libxml2 is located on your system. please make sure `pkg-config` is installedというようなエラーが表示される。
  • brew install libxml2は効果なし。以下のコマンドを試してみる。
    xcode-select --install

Ruby 2.4関連

Uncaught exception: cannot load such file -- xmlrpc/clientのエラー


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-01-25 (金) 15:37:32