2012-05-29 3 views
2

각 요청의 URL에 전달 된 GET 매개 변수에 따라 애플리케이션의 레이아웃을 변경하려고합니다 : &layout=name_of_the_layout. 레일 도우미 라우트 오버라이드 GET 매개 변수에서 레이아웃을 설정하는 방법

그리고 내 application_controller에서

가 다음 사용자가 응용 프로그램에서 탐색 할 때

class ApplicationController < ActionController::Base 
    layout :get_layout_from_params 

    private 
    def get_layout_from_params 
    if params['layout'] 
     params['layout'] 
    else 
     'application' 
    end 
    end 
end 

그것은 잘 작동하지만로 레이아웃을 "유지", 내보기에 각 레일 노선 도우미에이 매개 변수를 추가해야합니다 (심지어 형태의 POST 요청 ...에 대한) : get_layout_from_url()params['layout']이 URL에 설정되어있는 경우 확인하는 도우미가

ressource_path(@ressource, :layout => get_layout_from_url()) 

는, 다음의 유효성을 확인 돌려줍니다.

이것은 확실히 DRY가 아닙니다 ... 내 뷰에 추가 코드를 작성하지 않고이 동작을 포함하도록 모든 경로 도우미를 무시할 수 있습니까? 내 견해로는 표준 레일 메서드를 호출하고 싶습니다. ressource_path(@ressource), ...

또는이를 구현하는 더 효과적인 방법이 있습니까?

추 신 : 레일을 사용 중입니다. 3.2.3

고마워요!

답변

2

:

class ApplicationController < ActionController::Base 
    def url_options 
    { :layout => validate_layout }.merge(super) 
    end 

    def validate_layout 
    # some stuff reusable 
    params[:layout] 
    end 
end 

적합하지 않으면 닫습니다.

+0

정확히 내가 뭘 찾고 있었는지 고마워! – Tricote

2

나는 모든 요청에 ​​대해 URL에 추가하는 대신 세션에 저장하는 것이 더 좋습니다. 레일에서

, 당신은 매우 간단한 방법으로 세션을 사용할 수 있습니다

def get_layout_from_params 
    if params['layout'] 
    session['layout'] = params['layout'] 
    else 
    session['layout'] || 'application' 
    end 
end 

params['layout']이 경우, 사용자가이 세션에 할당 있도록 레이아웃을 바꿀 것입니다 의미합니다.

주어진 경우 session['layout']이 있는지 확인한 후 반환하거나 세션 [ 'layout']이 false 또는 nil 인 경우 'application'을 반환합니다.

--- 편집 --- 당신이 그것을 좋아하거나하지 않을 경우

다음 버전도 짧은, 참조 :

가 이전이었고, 지금 url_options로 대체 default_url_options되지
def get_layout_from_params 
    session['layout'] = params['layout'] || session['layout'] || 'application' 
end 
+0

안녕하세요, 답변 주셔서 감사합니다.이 URL을 관리하는 명확한 방법이지만, 동일한 세션에서 두 레이아웃에 모두 액세스 할 수 있으므로 모든 요청에 ​​대해 URL에 레이아웃 매개 변수를 전달해야합니다. – Tricote

관련 문제