2016-08-30 2 views

답변

5

이 루비의 문법 설탕 중 하나입니다.

루비는 조건문에 변수를 할당 할 수 있습니다 및

user_id = session[:user_id] 
if user_id 
    @current_user ||= User.find_by(id: user_id) 
end 

x = true #=> returns true

if (user_id = session[:user_id]) 
    @current_user ||= User.find_by(id: user_id) 
end 

가 동등 값을 반환 당신에게 선을 저장합니다. session[:user_id]이 위변조 인 경우 false 값을 user_id에 할당하고 해당 블록을 실행하지 않습니다.

+0

정확히 일치하지 않습니다. 첫 번째 예에서 user_id의 범위는 if의 본문입니다. 후자에서 user_id는 if 다음에 정의됩니다. – Ursus

+0

@Ursus : 잘못되었습니다. 그것을 irb에서 시도하십시오. 'if'는 Ruby의 스코프 게이트가 아닙니다. 클래스, 모듈 또는 메서드를 정의 할 때마다 새 범위가 만들어집니다. 여기에 대한 스코프 게이트 섹션에 대한 자세한 내용은 http://hopsoft.github.io/blog/ruby-metaprogramming-idioms/ – kiddorails

+0

답변 전에 irb에서 시도했습니다. 음. – Ursus

4

할당이 표현식이기 때문에 if 문에서 할당 연산자를 사용할 수 있습니다. 대입 표현식의 결과는 사용자가 지정하는 값입니다. 이 경우

, session[:user_id]하지 nil 또는 false 경우, if 분기 결과가 호출되며이 user_id session[:user_id]의 결과로 설정된다. session[:user_id]nil 또는 false 인 경우에도 user_id에 할당되지만 if의 논리는 평가되지 않습니다.

0

이것이 할당 연산자가 말하려고하는 것입니다. 이것은 @current_user 값이 null이면 user_id와 같게 설정한다는 것입니다. 그렇지 않으면 @current_user 값을 유지하십시오. 당신은 @current_user = @current_user || User.find_by(id: user_id)

1

이이 일을하는 것과 같습니다로 읽을 수 있습니다 :

user_id = session[:user_id] 
if user_id 
    @current_user ||= User.find_by(id: user_id) 
end 
관련 문제