2009-03-24 7 views
1

표준 레이아웃에서 헤더 부분을 호출하는 경우가 있습니다. (이것은 매우 일반적입니다.) 머리글은 검색 상자입니다. stackoverlow와 같습니다. 그러나 사용자가 검색 페이지에있을 때 헤더에서 검색 상자를 제거하고 싶습니다.Ruby On Rails의 도우미 메소드 재정의

나는이 같은 ApplicationHelper.rb 파일에 방법을 넣어 않는 시도하는 것 :

def search_page? 
    return false; 
end 

그리고 SearchHelper.rb에 나는이있다 :

def search_page? 
    return true; 
end 

이하지 않습니다 SearchHelper.rb의 search_page 함수가 어떤 컨트롤러가 뷰를 렌더링하고 있는지에 관계없이 사용되는 것이기 때문에 작동합니다. 나는 새로운 레이아웃을 정의하고 검색 상자를 렌더링하지 않겠다는 신호로 헤더 부분에 매개 변수를 추가 할 수 있지만 잔인한 것처럼 보입니다.

답변

1

은이 방법을 정의

def search_page? 
    controller.controller_name != "search" 
end 

이 컨트롤러의 이름은 무엇 이건 "search"를 교체합니다.

2

먼저 Ruby를 약간 수정하십시오.

def search_page? 
    true 
end 

당신은 세미콜론 또는 (마지막 줄이 메소드의 반환 값이됩니다 무엇이든)을 return 필요하지 않습니다.

둘째, 앱이 초기화 될 때 모든 도우미가로드됩니다. 이 동작을 변경할 수는 있지만 그만한 가치는 없습니다.

나머지는 _search_form.html.erb이라는 부분이 있다고 가정 해 보겠습니다. 레이아웃 파일에서 탐색 양식을 호출 (search_helper.rb의 말) 멋진 도우미 메서드

def search_form 
    render(:partial => 'search/search_helper') unless @search_page 
end 

사용이를 만듭니다. 그때부터 몇 가지 선택이 있습니다.

before_filter :set_search_page 

...your actions here... 

private 

def set_search_page 
    @search_page = true 
end 

을 또는 당신의 행동에 변수를 설정합니다 :

당신은 당신의 컨트롤러에 before_filter을 만들 수 있습니다이 정말보기 문제라고하지만

def some_action 
    @search_page = true 
end 

내가 오히려 말할 것 컨트롤러에서하고 싶은 것보다 나는 이것 (다시 search_helper.rb에서)과 같은 도우미 메서드를 만들 것이다. 이 같은

def search_page 
    @search_page = true 
end 

그리고 해당 페이지에 대한보기의 상단에, 내가 사용하는 거라고 뭔가 :

<% search_page %> 

(는 <%하지 <%=하다는 주 - 출력 없습니다.)

이점은 컨트롤러에서 불필요한 인스턴스 변수를 제거하는 것입니다. 응용 프로그램 도우미에서