#author("2016-10-25T13:42:20+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' *コントローラー [#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の自動ロード機能が有効にならない模様。