日付:2012年9月30日日曜日、時刻:11:17、差出人:dezawa:
出沢 @ Rails3移行勉強中 です皆様のおかげで、rake test が通るようになりました。が、rails server での評価に入ったところで引っかかって居ます。「こうすると必ず」ではないのが厄介なのですが、NoMethodError (undefined method `empty?' for nil:NilClass):app/controllers/ube_skd_controller.rb:379:in `makeplan'がでます。ブラウザー上もログにもバックトレースはなし。(1)ここは下のような文で empity? は使われていません。@model = UbeSkd.find(params[:id],:include => {:ube_plans => :ube_product})また、Rails.root配下にも使われていません(2)AR内部のmethodで起きているらしい。色々試して(3)どうやら[0]plans.product_id に 存在しない product#id が使われていると発生するという感触です。しかし、必ず起きるわけではない。(一度起きると頻繁に、ほぼ確実に起きます)rails console では発生しないということがあり、確信が持てません。アプリ自身はそうならないように仕掛けてはあるのですが、非定常作業でそうならない→無いproductは使えない、使われているproductは削除できない)(古い)productを削除してしまうことがあるようです。それも防ぐ手立ては考えますが、万一を考え消されたときの対応もとろうとおもっています。どうしたいか、というと(A)ARでは止めない(B)アプリで「存在しないProductが使われている」と警告し動作を中止(B)の方は仕込み終わったのですが、(A)をどうしてよいか分からず、発生し始めるとお手上げという状態です。さて、[1] [0]の推定は正しいのでしょうか、この様な時に例外を発生させない方法はあるでしょうか[2] [0]が正しいとして、なぜconsoleでは発生しない?[3] Skd.findのときに、:include オプションを使わないと、発生しない様なのです。これは正しい?もしこれが正しければ、DBのアクセスが増えても:include なしで済ませるのも手かと考えて居ます。が、なんか悔しいのです。よろしくお願いします############(1) Rails2 では /usr/lib/ruby にまでトレースしてくれたのですが、Rails3 では してくれないのでしょうか。(2) users_controller.rb にはあるのですが、skd_controller 実行時には通らないでしょう。$ find . | xargs grep empty?./app/controllers/users_controller.rb: if success &&user.errors.empty?(3)・発生し始めるとskd_controllernに他にもある以下の様な所でも起きる#index @models = UbeSkd.all(params[:id],:include => {:ube_plans =>:ube_product})・「そのようなproduct_idを持たないplan」だけしか持たない skd で実行すると起きない・@model = UbeSkd.find(params[:id])#,:include => {:ube_plans =>:ube_product})なら起きない・しかし、、、 console で以下を行っても正常に終了するので、ARだけの問題ではなさそう。@model = UbeSkd.find(id,:include => {:ube_plans => :ube_product})--使い方: http://QuickML.com/