13

私は次の作品を扱っています。

def index
  @user = User.find(params[:id]) 
  rescue
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
  else 
    flash[:notice] = "OK"
    redirect_to(:action => 'index')
end

今、私は正しいIDを持っているかどうかに関係なく、私の見解では常に「OK」になっています。何が間違っていますか?

「エラー」を表示するためにDBにIDがない場合に必要です。私も使用しようとしましrescue ActiveRecord::RecordNotFoundたが、同じことが起こります。

すべての助けに感謝します。

4

3 に答える 3

36

レスキュー ブロックの終了後のすべてのコードは、レスキュー ブロックにリターンがない場合にのみ解釈されます。したがって、rescue ブロックの最後で return を呼び出すことができます。

def index
  begin
    @user = User.find(params[:id]) 
  rescue
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
    return
  end
  flash[:notice] = "OK"
  redirect_to(:action => 'index')
end

また

def index
  @user = User.find(params[:id]) 
  # after is interpret only if no exception before
  flash[:notice] = "OK"
  redirect_to(:action => 'index')
rescue
  flash[:notice] = "ERROR"
  redirect_to(:action => 'index')
end

しかし、あなたの場合、rescue_fromまたはrescue_in_publicを使用する方が良いです

お気に入り

class UserController < ApplicationController
  def rescue_in_public(exception)
    flash[:notice] = "ERROR"
    redirect_to(:action => 'index')
  end

  def index
    @user = User.find(params[:id]) 
    flash[:notice] = "OK"
    redirect_to(:action => 'index')
  end
end

しかし、rescue_in_public の使用はあまり良いアドバイスではありません

于 2010-04-02T14:41:16.970 に答える
-5

それがない場合はuseridUser.find返しnilます。戻るnilことはエラーケースではなく、rescue.

于 2010-04-02T14:31:14.700 に答える