2017-12-04 14 views
0

私はこの次のエラーを取得しています:メソッドはnilであるが、動作していない場合は除外するようにしない限り、未定義のメソッド `アセスメント」:NilClass

undefined method `assessment' for nil:NilClass 

を以下の私のコードは条件があります。私もif条件付きで試してみましたが、無駄はありません。

評価がnilの場合はデフォルトにする必要があると思いますが、その方法はわかりません。

日はミリ秒単位でフォーマットされています1482985235000

<% @sales.methods.each do |data| %> 
    <%= Time.at(data.assessment.assessment_date/1000).strftime("%d/%m/%Y") unless data.assessment.assessment_date.nil? %> 
<% end %> 

答えて

2

安全なナビゲーションオペレーターを使用するか試してみてください。

data.try(:assessment).try(:assessment_date).nil?

安全ナビゲーションオペレータを使用します。

data&.assessment&.assessment_date.nil?

このエラーは、メソッドがnilで呼び出されたときに生成されます。データがnilの場合、アセスメントがnilであればassessment_dateはエラーとなります。どちらの方法でも、両方が存在することを確認する必要があります。
一般的に、インラインレスキューを使用せず、両方のオブジェクトをチェックすることで、この種のシナリオを処理します。あなたは任意のオプションで行くことができますまたはあなたもチェックすることができますdata.assessment.present? && data.assessment.assessment_date.present?

0

エラーはゼロにメソッドassessmentを呼び出していると言う...これがnilである事がdataであることを意味します。あなたの条件はdata.assessment.assessment_dateがnilであるかどうかをチェックしていますが、すでに失敗しているので、assessment_dateがnilであるかどうかのチェックにもなりません。data.assessment

+0

右。条件式からassessment_dateを削除すると、以下のようになります:未定義のメソッド '/ 'for nil:NilClass – DollarChills

+1

これはゼロであると推測しています。 – DollarChills

+1

はい。 'nil?'は、メッセージの受け渡しのスタック全体をチェックするのではなく、スタック上の最後のものをチェックするだけです。@Manishhの例のように各レベルをチェックする必要があります。 –

0

私はこの問題を解決しました。それが最良の方法であるかどうかは分かりませんが、機能します。私はrescue 0を呼び出しの最後に追加しました。

<% @sales.methods.each do |data| %> 
    <%= Time.at(data.assessment.assessment_date/1000).strftime("%d/%m/%Y") rescue 0 %> 
<% end %> 
関連する問題