#author("2022-06-28T05:17:23+00:00","default:src128","src128") #author("2022-06-30T06:07:06+00:00","default:src128","src128") &tag(Rails/トラブルシューティング); *目次 [#q70d8e0f] #contents *関連ページ [#sc06f186] -[[Rails]] *参考情報 [#d9257280] *Bundler関連 [#f554662e] **「Can't find gem bundler (>= 0.a) with executable bundle」エラー [#gbc92e8c] -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:https://bundler.io/blog/2019/01/04/an-update-on-the-bundler-2-release.html]]によるとBundler 2.0がリリースされたことにより、新しくRubyをインストールした環境ではbundler 2.0がインストールされてしまい、既存の環境と互換性がなくなっていることが原因らしい。 -以下のようにBundler 1.x系の最新版をインストールしておく。 gem install bundler -v '1.17.3' **Macでlibv8/therubyracerをインストールしようとしてエラー [#j670893a] ***参考情報 [#ub668d86] -[[Yosemite で libv8 と therubyracer をインストールする:http://3.1415.jp/d3wpyqjr/]] -[[Kamiya54::Memo - [備忘録] Yosemiteにしてからbundle installが通らなくなった原因と対応:http://www.kamiya54.info/post/104406379491/%E5%82%99%E5%BF%98%E9%8C%B2-yosemite%E3%81%AB%E3%81%97%E3%81%A6%E3%81%8B%E3%82%89bundle-install%E3%81%8C%E9%80%9A%E3%82%89%E3%81%AA%E3%81%8F%E3%81%AA%E3%81%A3%E3%81%9F%E5%8E%9F%E5%9B%A0%E3%81%A8%E5%AF%BE%E5%BF%9C]] ***現象 [#nc71375b] -環境はOS X El CapitanとRubyのバージョンは2.2.4。 -Gemfileの指定。 #pre{{ 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をインストールする方法が提唱されているがこれはやりたくない。 ***解決 [#k60819df] -Gemfileの指定を以下のように変更。 #pre{{ 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. [#v137d624] -画面に表示された場合、アプリログを確認する(log/production.log)。それを見れば代替原因が分かる **Uncaught exception: Specified 'mysql2'…(2015/10/28) [#td20bd27] -正確には以下のようなエラーが発生する 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:https://github.com/rails/rails/issues/21544]]によると、Gemfileでmysql2のバージョンを指定すれば良いらしい。 gem 'mysql2', '~> 0.3.18' -Rails 5.1.5でも発生した。その場合いかのように指定。 gem 'mysql2', '>= 0.3.18', '< 0.5' **gitでブランチを作成してmergeしようとするとコンフリクトする [#td46402d] -[[gitマージのコンフリクトで片方ブランチのファイル変更内容を採用 | EasyRamble:http://easyramble.com/resolve-git-merge-conflict.html]] -どちらかにあわせてあとでbundle updateしたほうが簡単。 *モデル [#o741028f] **ActiveRecord::UnknownAttributeReference [#c67e6248] -Ransackのorderで発生。 ActiveRecord::UnknownAttributeReference (Query method called with non-attribute argument(s): "date DESC, 'rank'"): -rankをシングルクォートで囲んでいるせい?もしくはDESCのせい? -とりあえず以下のようにしてしのぐ。 …result.order(Arel.sql("date DESC, 'rank'")).page(params[:page]) **モデルのコレクションクラスでcountが動作しない [#k22fb829] -[[ruby on rails - Array.count with block does not return correct answer - Stack Overflow:https://stackoverflow.com/questions/18309153/array-count-with-block-does-not-return-correct-answer]]にあるように、ブロック付きcountは動作しない。 -なぜならhas_manyなどで関連付けられたコレクションクラスは純粋なArrayではないから。直接配列を代入しても代入メソッドがオーバーライドされているためこの挙動はかわらない。 *コントローラー [#b3173f64] **コントローラーのメソッドが呼ばれない [#m7bef2d0] -コントローラーのメソッドがprivateになっていないか注意。 -privateを上の方に追加するとそれ以降privateとみなされてしまう。 *ビュー [#v1f7d57c] **ビューが更新されない [#k6484ed8] -form_withを使っている場合、「remote:true」になっている場合に注意。Ajaxリクエストとなりrenderがきかなくなる。 -Rails 6.1以降は「remote:false」だが、アップグレードした場合デフォルトは「remote:true」のまま。 **レイアウトが適用されない [#f44340fe] -コントローラーでinitializeをオーバーライドしていないか確認。 -initializeする場合、以下のようにsuperを呼び出さないとレイアウトが呼ばれなくなるなどの不具合が発生する。 #pre{{ def initialize super # 初期化処理 end }} *一般 [#f0cd3856] ** rails generateがフリーズする [#tc3017d6] -[[rails generate コマンドの反応が無いので対処した。 | Lonely Mobiler:https://loumo.jp/archives/24693]]によるとわりとよくある現象らしい。 -Control-Cで止めると「/spring/client/run.rb:117:in `gets': Interrupt」 -Springを止めればいいらしいが、なぜSpringのエラーが発生するかは不明。 #pre{{ $ bundle exec spring stop $ bundle exec rails g impressionist }} -[[railsのコマンドが動かない時はspringを(stop|kill)してみよう - Qiita:https://qiita.com/yokozawa/items/7b92c260f8c3dfec8e28]] やっぱりspringが動いているとだめっぽい。なぜspringが動きっぱなしになるかわからんが。 ** rails consoleが起動しない [#n78c8950] -以下のコマンドを実行すると固まる bundle exec rails console -[[Ruby on Rails console is hanging when loading - Stack Overflow:https://stackoverflow.com/questions/25027284/ruby-on-rails-console-is-hanging-when-loading]]の方法が効果あり。spring stopする。 $ bin/spring stop $ bundle exec rails console **プロダクション環境で全く動かない [#na595a2d] -サーバーを再起動してもエラー画面だけ表示されて一切動いている気配がない場合 -apacheのログなどみても何もわからない場合デバッグ表示を有効にしないといけないかもしれない。 -めんどくさい場合まずはじめにMySQLが動いているかどうか確認する。 -MySQLが動いていないと当然Railsも動かない。 **プロダクション環境でapplication.css(実際はapplication-ダイジェスト.css)が読み込まれない [#p8abc60d] -「config.assets.compile = true」ついでに「config.public_file_server.enabled = true」でもapplication-ダイジェスト.cssが作られない。 -[[ruby on rails - Assets not compiling - Stack Overflow:https://stackoverflow.com/questions/38938508/assets-not-compiling/38944906#comment65236745_38938508]]によると、「rake assets:clobber」か「delete public/assets」で良いらしい。実際そうだった。 **プロダクション環境でルートページが表示されない(Rails5.1) [#xa1c1794] -http://localhost:3000で「The page you were looking for doesn't exist.」が表示される。 #pre{{ 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」 [#r1be74c4] -[[rails sコマンド実行時に「Could not find a JavaScript runtime.」とエラーが出る場合の対処法 - Qiita:https://qiita.com/azusanakano/items/771dc9919f347de061d7]]。 -本番環境で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 **プロダクション環境で画像が表示されなし [#sa53bd77] -assetのコンパイルをしない場合以下のように設定する #pre{{ config.serve_static_files = true config.assets.compile = true }} **プロダクション環境でCSSが適用されない [#j3bf70e1] -public/assetsが古い可能性あり。 -一端削除してやりなおしてみる(precompileしない環境でも古いファイルが残っているとだめ)。 **DEPRECATION WARNING: The configuration option `config.serve_static_assets` has been renamed to `config.serve_static_files` to clarify its role [#sbf3f169] -development.rbで「config.serve_static_assets = true」を「config.serve_static_files = true」に変更。 **クラス名が衝突する [#mb248a4d] -Ruby一般の場合自作クラスをmoduleを使ってネームスペース内に格納するのが定石。 -ただしRailsの場合モデル名を自由にmodule内に入れることができないかもしれない。 -無理矢理するなら以下のような方法が使える?[[My class name conflicting with Ruby's - Stack Overflow:http://stackoverflow.com/questions/20940499/my-class-name-conflicting-with-rubys]] #pre{{ 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以下のクラスが自動リロードされない [#x90fad11] -基本的にconfig.rbに以下の設定を追加しておれば、Railsでは毎回クラスがリロードされるはず。 config.autoload_paths += Dir["#{Rails.root}/lib"] # 追加 -これがうまくいかない場合lib以下の.rbファイルで独自にrequireしていなか確認。requireしたファイルはRailsの自動ロード機能が有効にならない模様。 **プロダクション環境でlib以下のクラスが自動リロードできない [#s3796d7f] -例えばバッチ処理を実行しようとすると以下のエラーが表示される。 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エラーが発生 [#x052a58d] -マルチスレッド環境でRailsのautoloadがうまく働かないのが原因。 -require_dependencyで必要なファイルを手動ロードするのが良い(requireしてしまうとデバッグ中に変更が反映されてなくなってしまうので注意)。[[外部ファイル読み込み時の「require」と「require_dependency」の違い - Qiita:http://qiita.com/omega999/items/1964cc684d320160ec2b]] -lib関連ならばeager_load_pathsを追加するのもいいかもしれない。 config.autoload_paths += Dir["#{Rails.root}/lib"] config.eager_load_paths += Dir["#{Rails.root}/lib"] **サーバー起動時に「Could not find a JavaScript runtime.」と表示される [#w3ade5dc] -ExecJSがJavaScriptランタイムを見つけられないときに発生。 -[[rails/execjs: Run JavaScript code from Ruby:https://github.com/rails/execjs]]によると「Apple JavaScriptCore - Included with Mac OS X」ということでmacOSの場合特になにもしなくても大丈夫なはずがmacOS Catalinaではエラーとなっている(2020/04/09)。 -しかたないのでmacportsでnpm6をインストールすると大丈夫だった。 sudo port install npm6 **Your bundle is locked to mimemagic (0.3.5), but that version could not be found [#rf5250e1] -mimemagicがライセンス問題で削除されたのが原因。 -railsが依存している可能性があるので最新にアップデートする。 *macOS Sierra対策 [#ecd4eb2b] **rmagickがインストールできない [#n4070d5d] -2017/01/27(金)現在、rmagick-2.16.0がImageMagick7に対応していないのが原因。 -[https://github.com/rmagick/rmagick/issues/256 Now RMagick 2.15.4 can't be built with ImageMagick 7.0.x · Issue #256 · rmagick/rmagick · GitHub]が参考になる。 #pre{{ brew update brew rm imagemagick brew install imagemagick@6 brew link imagemagick@6 --force }} -ただしこれだとbrew doctorでkeg-onlyのエラーが表示されるので以下の設定を使用する。 export PKG_CONFIG_PATH=/usr/local/opt/imagemagick@6/lib/pkgconfig **nokogiriがインストールできない [#r7f668c1] -システムライブラリを使わないとだめっぽい。 #pre{{ 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 [#n9785364] -mysql2をインストールしようとしたらエラー。 -[[mysql - Error when trying to install app with mysql2 gem - Stack Overflow:http://stackoverflow.com/questions/30834421/error-when-trying-to-install-app-with-mysql2-gem]] -以下のコマンドを実行する。 xcode-select --install **全般設定 [#d38245a7] -therubyracer、rmagick、nokogiriのバージョン指定を外す。 -libv8は直接指定しない。 *macOS Sierraの古い情報 [#v4dcdfa1] **../src/scanner.h:444:5: error: unused typedef '__StaticAssertTypedef__444 [#e1098a42] -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 [#me2fcf73] -linking shared-object mysql2/mysql2.bundle -macOS Sierra環境で発生。[[RailsプロジェクトでMySQLがbundle installできなかった - Qiita:http://qiita.com/akito19/items/e1dc54f907987e688cc0]]が参考になる? $ 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 [#p0110451] -macOS Sierra環境で発生。[[Now RMagick 2.15.4 can't be built with ImageMagick 7.0.x · Issue #256 · rmagick/rmagick · GitHub:https://github.com/rmagick/rmagick/issues/256]] #pre{{ brew rm imagemagick brew install imagemagick@6 PKG_CONFIG_PATH=/usr/local/opt/imagemagick@6/lib/pkgconfig gem install rmagick }} -bundlerを使うときはexportするしかない?そうすると他のパッケージのビルドで困るので「bundle config」を使って設定? **Nokogiriがインストールできない [#pe2784fc] -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関連 [#m0429146] **Uncaught exception: cannot load such file -- xmlrpc/clientのエラー [#t40d25fa] -[[ubuntu - Ruby fog gem causing server not to run: cannot load such file -- xmlrpc/client (LoadError) - Stack Overflow:http://stackoverflow.com/questions/41784012/ruby-fog-gem-causing-server-not-to-run-cannot-load-such-file-xmlrpc-client]]。Ruby 2.4以来Gemfileでxmlrpcを指定しないといけなくなった? gem 'xmlrpc' *Debian 8 Jessie [#p7d35d04] **ExecJS::RuntimeUnavailable: Could not find a JavaScript runtime [#h1140564] -Debian 8では古いnodejsしか使えないのが原因。 -公式リポジトリ[[nodesource/distributions: NodeSource Node.js Binary Distributions:https://github.com/nodesource/distributions]]を参考にインストールする。 #pre{{ # Using Debian, as root curl -sL https://deb.nodesource.com/setup_10.x | bash - apt-get install -y nodejs }}