2012-08-06 2 views
0

는 내가 레일 응용 프로그램을 가지고 있고, 내 응용 프로그램 컨트롤러에, 나는 다음과 같은 코드가 의도 한대로 작동하지 않는 :레일 조건

redirect_to :login unless @current_user = User.find_by_uid(session[:cas_user]) 
@current_user.syncUserRoles 

그래서, 이것은 성공적으로 발견되지 않는 로그인을 리디렉션하도록되어 그들의 사용자 계정. 그러나 @current_user가 nil을 반환하더라도 다음 줄로 계속 이동했습니다. 이 인라인을 무시 라인 2를 제외하고 마지막 경우에 날려 전체에 의지하는 내가 가진 라인 (3)에 nilClass 오류와 함께 밖으로 오류 것이다, 그러나

@current_user = User.find_by_uid(session[:cas_user]) 
redirect_to :login unless @current_user.present? 
@current_user.syncUserRoles 

: 그래서, 나는 다음에 코드를 수정 else 문을 사용했지만 내가 뭘 잘못하고 있었는지 알고 싶습니다.

if @current_user.present? 
    @current_user.syncUserRoles 
else 
    redirect_to :login 
end //This works as intended 

답변

1

여기의 혼동은 redirect_to의 작동 방식이며 unless이 아닙니다. redirect_to302 Moved 헤더를 설정하기 만하면 작동하지 않습니다. 따라서 다음 줄은 계속 실행되며 (사용자의 @current_user.syncUserRoles 줄) 렌더링을 수행하면 302 상태 코드가 설정됩니다.

발견 한대로 else 브랜치에 두는 것은 해당 행의 실행을 피하는 하나의 방법입니다.

2

redirect_to는 메소드에서 코드 실행을 중지하지 않습니다. 코드 실행을 중단하려면 return을 호출하십시오.

(redirect_to :login && return) unless @current_user = User.find_by_uid(session[:cas_user]) 

이렇게 작동합니까?

+0

작동합니다! 그러나 어떤 이유로, 같은 코드 조각에 대해 다시 돌아 오면 @current_user를 설정하지 않습니다.이 시점에서도 사용자는 존재합니다. 하지만 고마워, 나는 (내가 추측하는 PHP에 너무 익숙하지 않은) 그것을 알지 못했다. – Oranges13

+1

'session [: cas_user]'와'User.find_by_uid (session [: cas_user])'가 둘 다 있다고 생각하는지 ... 둘 중 하나는 틀린 값이거나 잘못된 값을 포함 할 수 있습니다. –