2012-01-11 6 views
11

가 나는 학습 레일 전에레일/루비 "와 false를 돌려"구문

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

을하고 있어요 레일 튜토리얼에서이 코드를 본 적이, 내가 루비 연구와 책의 아무도 많은 양의 않았다 나는이 "거짓과 거짓"문법을 여기서 다루는 것을 읽었다. 난 레일 구문에서 그것에 대한 언급을 찾을 수 없으며, 누구나 링크를 제공 할 수 있습니까? 아니면 이것을 정리할 설명이 있습니까?

루비가 항상 마지막으로 평가 된 표현식을 반환 할 것이라고 생각했기 때문에 "and"에 대한 필요성을 이해하지 못합니다.

+0

오, 당신이 * 왜 * 사용할지 묻고있는 줄 알았는데. 어쨌든, 내 답변에 설명 된대로 필터에 의해 사용되고 있다면, 매우 조심하십시오. –

답변

21

은 이전 문장과 같은 줄에 거짓 수익을 쓸 수 있도록에만있다.

이이 일의 상당의 :

redirect_to login_path, :notice => "Please log in to continue" 
return false 

그것을 년대 redirect_to 방법은 전무 또는 없는 뭔가를 반환하는 경우가 "와"그것은 단지 거짓 반환에 있기 때문에 정확히 같은 false하지만 거의 항상 무언가를 반환하므로 도 아니고 거짓입니다. 그러면 명령문의 오른쪽이 항상 실행됩니다 (거짓이 리턴됩니다.).

와 루비 그래서 먼저는 그것의에 무엇이든 평가,이 문장의 다른 부분보다 낮은 우선 순위를 가지고, & & 단지의 별칭이며, 단 하나 개의 차이와 똑같이 동작 왼쪽으로 이동 한 다음 적용됩니다. 루비에는 또는도 있습니다. ||이지만 표현식에서 우선 순위가 낮습니다.

+1

항상 실행되는 리턴 값을 추가하고 싶지만 첫 번째 표현식이 항상 false가 아닌 값을 반환하지 않는다는 확신이 없다면 다음과 같이'and' 대신 세미콜론을 사용할 수도 있습니다 :'do_something 인수, 인수; 거짓 반환 –

2

필터 반환 값이 예상되는 경우 필터와 함께 사용되는 이러한 종류의 구조입니다. false은 정상적인 요청 처리를 중지합니다.

그래서 컨트롤러가이처럼 보였다 경우 :

class FooController < ActionController::Base 
    before_filter :access_denied 
    # etc. 
end 

실행됩니다 컨트롤러의 동작 없음; 요즘 필터 반환 값은 무시됩니다

def check_access 
    return access_denied unless current_user.has_access 
end 

:이 방법은 것처럼,에서 에게 필터를 호출 할 수 있도록 설계되었다.

액션에서 정상적인 방법으로 동작 처리를 중단하고 리디렉션 후에 돌아올 수 있으므로 다른 로직/렌더링/등은 사용할 수 없습니다. 컨트롤러 내부에서 실행됩니다.

3

redirect_to login_path, :notice => "Please log in to continue"합니다 (source code을 보거나 닐)는 false를 반환하지 않는 루비 정규 표현이므로, 프로그램 실행은 계속된다 (이후 두 번째 부분을 확인하기 위해) 및 return false가 실행될 수있다.연산자에 대한

1

문서 : Under the "Defined?, And, Or, and Not" section

and를 사용하여 함께 그 중 하나가 nil 또는 false 반환 될 때까지 관련 작업을 체인에 유용합니다. 질문에 표시된 것처럼 사용할 수도 있고 코드 줄을 단락시키는 데 사용할 수도 있습니다.

# Short circuit example 
blog = Blog.find_by_id(id) and blog.publish! 

블로그 만 find_by_id가 성공하면 .publish!가 호출 가져옵니다. 당신의 예에서

: 그들은 단지 더 컴팩트 한 줄의 코드를 작성하는 데 사용하는

def access_denied 
    redirect_to login_path, :notice => "Please log in to continue" and return false 
end 

.

def show 
    if something 
    render :partial => 'some_partial' 
    end 

    render :partial => 'some_other_partial' 
end 

레일 당신에게 경고를 줄 것이다 :

그러나, 그것은 또한 당신이 조건문을 기반으로 렌더링 할 수있는 컨트롤러 액션에 유용하고 레일을받지 않으 경고 "여러 렌더" 예 : something이 액션에서 평가되는 여러 렌더링 문을 가지고 있기 때문에 true를 반환합니다. 그러나이를

if something 
    render :partial => 'some_partial' and return 
end 

으로 변경하면 작업 실행을 중지 할 수 있습니다.

관련 문제