web-dev-qa-db-ja.com

Rails

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

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を使おうとしましたが、同じことが起こります。

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

12
Adnan

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

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の使用は本当に良いアドバイスではありません

33
shingara

全体的にRailsレスキューの答え:

私はこれがとてもクールだと思いました:

@user = User.find(params[:id])  rescue ""
4
Vinozio