2010-04-02 5 views
9

다음 작품으로 작업하고 있습니다.레일에서 구조 작업

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"가 무엇입니까 여부를 두 경우 모두, 내가 무슨 일을하고 있는가?

"ERROR"를 표시 할 ID가 DB에 없을 때 필요합니다. 나는 또한 rescue ActiveRecord::RecordNotFound을 사용하려고 시도했지만 동일한 일이 발생합니다.

모든 도움을 주실 수 있습니다.

+0

앱에서이 실제 코드인가? 마치 무한 루프가되는 동일한 동작 (인덱스)으로 리디렉션하는 것처럼 보입니다. – mikej

답변

30

구조 블록의 끝에 오는 모든 코드는 구조 블록에 반환 값이없는 경우에만 해석됩니다. 그래서 당신은 구조 블록이 끝날 때 귀환 할 수 있습니다.

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 

그러나 귀하의 경우에 더 나은

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_from 또는 rescue_in_public

을 사용하는 것입니다 그러나 rescue_in_public으로 사용하는 것은 정말 좋은 조언

아니다
-5

id이없는 user이 없으면 User.findnil을 반환합니다. nil을 반환하는 것은 오류가 아니며 rescue을 트리거하지 않습니다.

+0

감사합니다 @ Justice는 그것이 nil을 반환한다는 것을 잊었습니다. – Adnan

+8

나는 이것이 옳지 않다는 것을 확신한다. 유효하지 않은 ID를 가진'find'는'ActiveRecord :: RecordNotFound'를 발생시킵니다. 예를 들어 동적 찾기 중 하나를 사용하는 경우 'User.find_by_name'은 레코드와 일치하지 않는 값으로'nil'을 반환합니다. http://api.rubyonrails.org/classes/ActiveRecord/Base.html#M002263 – mikej

+1

글쎄, 선생님, 제가 확인 했으니까요. 고맙습니다. OP에서 find 호출은 실제로 코드가'User.find (: first, params [: id])'가 아니면 실제로 발생해야합니다. – yfeldblum

2

그냥 전체 레일 구조 답 :

내가 발견이 아주 멋진 될 :

@user = User.find(params[:id]) rescue "" 
관련 문제