2012-07-11 3 views
1

저는 Head First Rails를 통해 작업 중이며 조금 혼란스러워하는 코드를 발견했습니다. 이 코드의 목적은 새 레코드를 만들 때 오류가 있었는지 확인하고 확인하는 것입니다. 오류가 있으면 목표는 페이지를 다시 표시하는 것입니다. 오류가 없으면 목표는 레코드를 데이터베이스에 저장하는 것입니다.레일즈 컨트롤러 Object.save

def create 
    @ad = Ad.new(params[:ad]) 
    if @ad.save 
     redirect_to "/ads/#{@ad.id}" 
    else 
     render :template => "ads/new" 
    end 
end 

나를 혼란이 코드에 대한 유일한 것은이 사실을 라인을 (@ ad.save 경우) : 여기 책이 제공하는 컨트롤러 코드입니다. 자,이 줄은 오류가 있는지 테스트하기위한 것입니다. 있을 경우 거짓을 반환하고 그렇지 않으면 true를 반환합니다. 그러나 오류가 없으면 (사실을 반환하는) 레코드가 실제로 저장됩니다. Ruby의 "if"구문이 조건을 테스트 한 것으로 생각했지만,이 경우 조건은 테스트되고 실행되었습니다. 이상한 점은 다른 @ ad.save를 추가하면 데이터베이스가 레코드를 두 번 저장하지 않는다는 것입니다. 좋아요 :

def create 
    @ad = Ad.new(params[:ad]) 
    if @ad.save 
      @ad.save 
     redirect_to "/ads/#{@ad.id}" 
    else 
     render :template => "ads/new" 
    end 
end 

이 코드는 첫 번째 코드 비트와 완전히 똑같습니다. 첫 번째 코드에서 @ad.save가 실행되는 이유는 무엇입니까? 그리고 두 번째 코드 비트가 어떻게 @ ad.save가 두 번 실행되지 않는지 (단 하나의 레코드 만 만들어 짐)?

답변

1

if에 대한 가정은 올바르지 않습니다. 그들은 실제로 코드를 실행할 수 있습니다.

def return_true 
    puts 'inside method' 
    true 
end 

if return_true 
    puts "it ran some code" 
end 

# output will be: 
# inside method 
# it ran some code 

두 번째 예에서는 저장이 적어도 한 번 실행됩니다. @as.save의 결과가 true 일 경우 두 번째 실행됩니다. 그것이 if 브랜치의 첫 번째 부분을 거치면 다른 것이 데이터베이스에 두 번 저장되는 것을 막아 주지만 그 이유를 말해 줄 정보가 충분하지 않습니다. 당신에게는 독특한 억지력이있을 수 있습니다. @ad.save!을 시도해보십시오. 유효성 검사 오류가 있으면 bang 버전에서 오류가 발생합니다.

관련 문제