#author("2017-02-03T19:05:50+09:00","default:wikiwriter","wikiwriter") &tag(Rails/トラブルシューティング); *目次 [#q70d8e0f] #contents *関連ページ [#sc06f186] -[[Rails]] *参考情報 [#d9257280] *Bundler関連 [#f554662e] **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' **gitでブランチを作成してmergeしようとするとコンフリクトする [#td46402d] -[[gitマージのコンフリクトで片方ブランチのファイル変更内容を採用 | EasyRamble:http://easyramble.com/resolve-git-merge-conflict.html]] -どちらかにあわせてあとでbundle updateしたほうが簡単。 *コントローラー [#b3173f64] **コントローラーのメソッドが呼ばれない [#m7bef2d0] -コントローラーのメソッドがprivateになっていないか注意。 -privateを上の方に追加するとそれ以降privateとみなされてしまう。 *ビュー [#v1f7d57c] **レイアウトが適用されない [#f44340fe] -コントローラーでinitializeをオーバーライドしていないか確認。 -initializeする場合、以下のようにsuperを呼び出さないとレイアウトが呼ばれなくなるなどの不具合が発生する。 #pre{{ def initialize super # 初期化処理 end }} *一般 [#f0cd3856] **プロダクション環境で全く動かない [#na595a2d] -サーバーを再起動してもエラー画面だけ表示されて一切動いている気配がない場合 -apacheのログなどみても何もわからない場合デバッグ表示を有効にしないといけないかもしれない。 -めんどくさい場合まずはじめにMySQLが動いているかどうか確認する。 -MySQLが動いていないと当然Railsも動かない。 **プロダクション環境で画像が表示されなし [#sa53bd77] -assetのコンパイルをしない場合以下のように設定する #pre{{ 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 [#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の自動ロード機能が有効にならない模様。 **Circular dependency detectedエラーが発生 [#x052a58d] -マルチスレッド環境でRailsのautoloadがうまく働かないのが原因。 -require_dependencyで必要なファイルを手動ロードするのが良い(requireしてしまうとデバッグ中に変更が反映されてなくなってしまうので注意)。[[外部ファイル読み込み時の「require」と「require_dependency」の違い - Qiita:http://qiita.com/omega999/items/1964cc684d320160ec2b]] *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 }} **全般設定 [#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] -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" **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] -PENDING