2

私は次のショーアクションを持っています:

def show
  @name = params[:id]
  rescue ActiveRecord::RecordNotFound
  redirect_to :action => 'index'     
  @rpm = FedoraRpm.find_by_name(@name, :include => :rpm_comments)
  @page_title = @rpm.name
end

そこにレスキューステートメントを追加しましたが、機能していないようで、存在しないURLを表示しようとすると次のエラーが発生します。

undefined method 'name' for nil:NilClass

これが変数に関連している可能性があることは知ってい@page_titleますが、どうすればこれを修正できますか?

4

2 に答える 2

5
@rpm = FedoraRpm.find_by_name(@name, :include => :rpm_comments)

結果が見つからない場合はnilを返します。これはおそらくあなたの場合です。name次に、 nilオブジェクトを呼び出そうとします。

クエリがnil値を返すことが予想される場合は、それに応じてコードを変更してください。

レスキューステートメントはそこでは意味がありません。使用時にレコードが欠落している場合にリダイレクトする場合

def show
  @name = params[:id]
  @rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
  @page_title = @rpm.name
rescue ActiveRecord::RecordNotFound
  redirect_to :action => 'index'     
end

ファインダーのバングバージョンを使用したことに注意してください。

@rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
于 2012-12-20T12:21:50.510 に答える
2

確かにそうです。2つの理由があります:

  1. 使用するレスキューステートメントは、エラーが発生する場所の前、または発生する可能性のある場所の前にあります
  2. findメソッドを使用するか、!を追加した場合にのみ発生する特殊なタイプのエラーActiveRecord::RecordNotFoundを指定します。find_by_nameの最後に

したがって、次のように、レスキューラインをメソッドの一番下に移動する必要があります。

def show
  @name = params[:id]
  @rpm = FedoraRpm.find_by_name!(@name, :include => :rpm_comments)
  @page_title = @rpm.name
rescue ActiveRecord::RecordNotFound
  redirect_to :action => 'index'     
end

追加したことに注意してください!find_by_nameの最後にマークを付けると、レコードが見つからないという例外が発生します。この場合、nilが返されるだけなので、nilから.nameを取得しようとするとエラーが発生します。

于 2012-12-20T12:22:13.340 に答える