前島です。

なかなか入り組んだ問題だと思うので、ソースとDBの状態が見れる人じゃないとデバッグは難しいのではないでしょうか。

日付: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})

--
ML: rails@ruby.ml.fdiary.net
使い方: http://QuickML.com/