2012-10-11 3 views
0

내 레일 3.2 프로젝트에서 컨트롤러에 show_html 기능이 있습니다. 데이터베이스에 특정 URL이있는 사이트를 찾을 수 있으면 해당 URL이보기로 전달됩니다. 그렇지 않으면, 나는 그것이 내가 그것을 테스트 http://www.google.com레일 : 컨트롤러에서 리디렉션

def show_html 
    site_list = Site.where(:url => params[:url]) 
    if site_list.length > 0 
    site = site_list.first 

    else 
    redirect_to "http://www.google.com" 
    end 

    @html = site.html 
    render "show_html.html.erb" 

end 

site_list.length > 0로 리디렉션 할, 그것을 작동합니다. 그러나 site_length_list = 0 일 때 오류 undefined method 'html' for nil:NilClass가 발생합니다. 왜 그것은 else 진술에 들어가서 google.com을 렌더링하지 않습니까?

+0

을 정의합니다. – uday

답변

1

리디렉션이 실행 된 후 지침처럼 보입니다. 이 문제를 언급하는 article가 있습니다. 이 문제를 해결하기

한 가지 방법은과 같이 return로 리디렉션입니다 :

 
def show_html 
    site_list = Site.where(:url => params[:url]) 
    if site_list.length > 0 
    site = site_list.first 

    else 
    return redirect_to "http://www.google.com" 
    end 

    @html = site.html 
    render "show_html.html.erb" 

end 
+0

알았어, 고마워! –

2

당신은 렌더링 (그리고 다른 조건에서 nil.html입니다 site.html) 리디렉션 후 필요가 없습니다. 그 중 하나가 필요합니다. 당신이 if로하지 않는 경우

def show_html 
    site_list = Site.where(:url => params[:url]) 
    if site_list.length > 0 
    site = site_list.first 
    @html = site.html 
    render "show_html.html.erb" 
    else 
    redirect_to "http://www.google.com" 
    end 
end 
2

, 당신의 sitenil 될 것입니다.
returnredirect으로 설정하지 않으면이 함수는 아무런 오류가 없더라도 모든 방향으로 내려갈 것입니다. 리다이렉트 + 렌더링으로 다른 하나를 얻게 될 것입니다.

깨끗한 방법은 내가 당신이 클래스의 아무 곳이나 선언 힘 추측은`html` 액션을 찾고, 라인 10에서 함수

def show_html 
    site_list = Site.where(:url => params[:url]) 

    return redirect_to "http://www.google.com" if site_list.empty? 

    site = site_list.first 
    @html = site.html 
    render "show_html.html.erb" 
end 
+0

깨끗한 방법에 감사드립니다! –

관련 문제