2013-08-01 4 views
0

저는 Ruby 언어와 Ruby on Rails에 새롭기 때문에 내 질문에 단어를 쓰는 방법을 잘 모르고 틀린 용어를 사용합니다. Nilclass을하지만, 다음 코드는 잘 작동 : 내가 왜 이해가 안변수를 함수 및 if 문과 동일하게 설정하십시오.

@user = User.find_by email: params[:session][:email] 
if @user && @user.authenticate(params[:session][:password]) 
    # Signin @user 
else 
    # Render failed Signin 
end 

다음 코드는 내가 방법을 인증합니다 무기 호에 대해 정의되지 않는다는 오류가 발생

@user = User.find_by email: params[:session][:email] 
if @user.authenticate(params[:session][:password]) 
    # Signin @user 
else 
    # Render failed Signin 
end 

작동하지 않습니다 첫 번째 코드 블록이 작동하지 않습니다. @user를 정의 할 때 User.find_by 메소드가 실행되지 않고 @user의 값을 설정합니까? 아니면 프로그램에서 호출 될 때만 변수 값이 설정됩니까?

편집 : 불필요한 괄호가 제거되었습니다.

+0

사용중인 레일 버전은 무엇입니까? –

+0

레일즈 4.0 –

답변

3

가 여기에 내가 첫 번째 블록에 틀린 생각이다 : 첫 번째 블록에서

, 당신은 사용자를 검색하고 발견되지 않는 경우는 nil를 반환합니다. 그런 다음 nil을 인증하려고 시도하는 것이므로 그 이유는 not defined for Nil:class입니다.

두 번째 블록에서 if block@user을 추가하여 문제를 해결할 수 있습니다. 실제로 검색된 사용자가 있는지 여부를 테스트하여 사용자가 블록을 찾지 못하면 블록을 실행하지 않습니다.

+0

고마워요! 이것은 나에게 의미가있다. 지난 2 시간 동안 문제를 검색하고 아무 것도 찾을 수 없었습니다. 나는 당신의 대답을 업 그레 이드하려했지만, 분명히 아직 그렇게하기에는 충분한 명성이 없습니다. –

+0

Np, 이것이 정답이라고 생각한다면 그냥 그 것으로 표시하십시오. – PericlesTheo

0

사용 된 find_by 메서드는 NoMethodError 예외가 발생해야합니다 (사용자 모델에서 해당 메서드를 정의하지 않은 경우).

당신은

User.find_by_email(params[:session][:email]) 

UPDATE와 같은 사용자의 속성 중 하나에 동적 파인더 메소드 (http://guides.rubyonrails.org/active_record_querying.html#dynamic-finders)를 사용할 수 있습니다 : 대답을 게시 할 때 나는 레일 3의 생각, 4 동적 파인더를 제거 레일 및 방법 당신은 완벽하게 유효합니다.

+0

을 사용하여 이러한 답변을 게시하기 전에 @Jason이 (가) 사용하는 레일 버전을 잘 알아야합니다. Rails 4에는 find_by (* args) 메소드 –

+0

이 있어야한다. 감사! –

0

시작하려면 here&& 운영자의 좋은 분석 - 그것이하는 것과하지 않는 것. 두 번째 줄에서 첫 번째 블록의

: - 하산은 지적으로 또한 find_by_email를 사용한다
if @user.authenticate(params[:session][:password]) 

@user 주위

if (@user.authenticate(params[:session][:password])) 

괄호가 필요하지 않습니다.

+0

감사합니다. 필자는 불필요한 괄호를 제거했지만, 필자가 읽은 것 중에서 find_by가 find_by_email보다 Rails 4.0에서 더 선호 되었습니까? –

+0

아, 죄송합니다. 레일 4.0을 사용하고 계신 것을 몰랐습니다! – dax