2016-07-01 3 views
1

레일의 DRY 개념에 대해 많이 배우고 있습니다. 내 질문은 여기에 있습니다.전역 변수는 어디에 있습니까?

Locations과 같이 항상 다양한 객체를로드해야하는 애플리케이션의 고정 된 사이드 바가 있습니다. 내 index 페이지와 관련된 컨트롤러에서

, 실제로 controllers/pages_controller.rb에 내가 @locations로드 해요 : 나는 위치를 선택하고로드하면, 그러나, 내 탐색 메뉴 (사이드 바)에 대한 잘 작동

@company = current_user.company 

@locations = if @company 
    current_user.company.locations.order(:name) 
else 
    [] 
end 

다른 컨트롤러에서 위임 한보기 (이 경우 locations/show.html.erb) 내 @locations 변수를 더 이상 찾을 수 없습니다.

물론, locations_controller.rb 파일의 show 메소드에 추가 할 수는 있지만, 위의 코드를 사이드 바 탐색 메뉴에 의존하는 모든 단일 컨트롤러 메소드에 넣어야한다고 생각하지는 않습니다. 그것들은 고정되어 있기 때문에!)

한 번 수행하고 모든 컨트롤러에서 수행하지 않아도되는 DRY 방법은 무엇입니까?

답변

1

당신은 당신의 pages_controller에 그런 다음 application_controller

def set_locations 
.... 
end 

의 방법을 만들 수 locations_controller 추가 그것은 전에 모든 페이지 및 위치의 모든 메소드를 호출 세트 위치를 설정합니다 before_filter

before_filter :set_locations 

제어 장치. 당신은 단지 몇 컨트롤러의 행동에 대한 위치를 설정하려면

다음 전화 :

before_filter :set_locations,:only=>[:show,:index, :your_action_name] 

업데이트 : 5 before_filter이되지 않습니다

레일에서 당신이

+1

before_action을 사용할 수 있습니다 ** 그냥 참고 사항 : ** Rails 5에서는 before_filter가 더 이상 사용되지 않으므로'before_action' 콜백을 대신 사용합니다. – bntzio

0

모든 작업 전에 실행되는 메서드에서 ApplicationController에 추가 할 수 있습니다. 모든 컨트롤러는이 ApplicationController에서 상속되므로 사용할 수 있습니다.

관련 문제