11

私は現在3.2を使用していますが、Rails 3.0用に書かれたKevin SkoglundのチュートリアルRuby on Rails 3 Essential Trainingに従っています。親サブジェクトに属するページのみを表示するために、before_filter を使用して pages_controller で次のメソッドを使用します。

結果が nil の場合、「エラーを返さない」ため、チュートリアルでは明示的に .find_by_id を使用します。ただし、@subject が nil に設定されているページを表示しようとすると、「nil の呼び出された ID、誤って 4 になります。本当に nil の ID が必要な場合は、object_id を使用してください」というエラーが表示されます。

def find_subject
  if params[:subject_id]
    @subject = Subject.find_by_id(params[:subject_id])
  end
end

エラーの原因となっている実際のコードは次のとおりです。

def list
  @pages = Page.order("pages.position ASC").where(:subject_id => @subject.id)
end

これは3.0以降に変更されたものですか?もしそうなら、3.2 でこの機能を実装する正しい方法は何でしょうか?

4

3 に答える 3

12

メッセージ:

"nil の id を呼び出しましたが、これは誤って 4 になります -- 本当に nil の id が必要な場合は、object_id を使用してください"

値を呼び出そうとしたことを知らせる Rails の標準メッセージ.idですnil

したがって、@subjectが nil の場合、 を呼び出そうとすると、そのメッセージを取得するのが通常の適切な動作です@subject.id

@subjectビュー ファイルでは、その可能性を考慮しnil、情報を表示する方法で対処することをお勧めします。@subjectコードを見て、ビューに何を表示する必要があるかを考えてくださいnil

于 2012-06-26T02:48:45.160 に答える
2

あなたが使っているコードを見ていなかったのは間違っているかもしれません。しかし、あなたは使用する必要があります

params[:id]

簡単に確認するには、ifステートメントの前にこれを置いてください。

puts ">>> #{params[:subject_id]}"

それがあなたにIDを与えるなら、私は間違っています...

于 2012-06-26T02:41:45.223 に答える
0

貼り付けたコードは、おそらくそのエラーをスローしていません。あなたのビューでは、おそらく@subject.idそのエラーをスローするものを表示しています。問題が発生している正確な行を示すスタック トレースを取得する必要があります。

于 2012-06-26T02:49:43.207 に答える