4

パラメータのないメソッド、またはレコードを生成しないパラメータIDを呼び出すと、nilチェックが失敗する理由を理解しようとしています。

@game = Game.where(:id => params[:id]).first

if @game.nil?
  redirect_to root_path
end

コンソールでは、これは正常に機能します。

>> pp @game.nil?
=> true

アプリケーションでは、これは失敗します (リダイレクトされません!)、なぜですか?

編集1:

コンソール (パラメーター ID nil または存在しないレコード値): これは機能します:

unless Game.exists?(params[:id])
  raise('ok')
end

しかし、実際のアプリケーションではそうではありません:(レコードが存在または有効であることを確認するためにほぼすべての方法を試しましたが、コードはこのチェックを過ぎて実行され、そのまま続行されます

編集2:

returnステートメントを使用していることに気付いた他のコードを見ると、ITはそれで解決するようです..

作品:

unless Game.exists?(params[:id])
  redirect_to root_path
  return
end

失敗:

unless Game.exists?(params[:id])
  redirect_to root_path
end

redirect_to 明示的な後にリターンが必要な理由がよくわかりません

4

2 に答える 2

0

この if ステートメントの後、コントローラ メソッドは続行されますか? redirect_toメソッドから戻りません。その場で実行を停止してリダイレクトしたい場合は、次のようにして明示的に戻る必要があります。

if @game.nil?
  redirect_to root_path && return
end
于 2013-10-07T17:27:58.383 に答える