2010-12-16 2 views
0

나는 내 컨트롤러에 @sort_by 속성을 추가하고 값이이처럼 초기화 : 레일 : 기본 응용 프로그램 레이아웃이 사용되지 않는 이유는 무엇입니까?

class ProductsController < ApplicationController 
    def initialize 
    @sort_by = :shop_brand 
    end 
    ... 
end 

하지 사용되는 기본 응용 프로그램 레이아웃을 일으켰습니다.

왜?

컨트롤러에 속성을 추가하고 초기화하는 올바른 방법은 무엇입니까?

답변

6

생성자를 재정의하는 것은 아마도 당신이 발견 한대로 나쁜 생각 일 것입니다. 당신이 상태를 유지하려면 같은

class ProductsController < ApplicationController 

    before_filter :set_defaults 

    ... 

    private 

    def set_defaults 
    @sort_by = :shop_brand 
    end 

end 

그러나, 소리 : 당신은 before_filter 사용한다.

def set_defaults 
    session[:sort_by] ||= :shop_brand 
end 

다른 옵션은 URL에서 현재 sort_by 값을 전달하는 것입니다 : 가장 쉬운은 브라우저를 닫을 때까지 자동으로 사용자별로 유지됩니다 사용자의 세션에 저장하는 것입니다. 각 링크 나 양식이 값을 다음 요청으로 복사하도록해야하므로 구현하기가 더 어렵습니다. 그러나 이것의 장점은 사용자가 여러 개의 탭을 다른 순서로 열어 놓았을 수 있으며 북마크 된 링크는 다음에 같은 순서를 복원 할 수 있다는 것입니다. 이것은 검색 엔진과 같은 것들이 사용하는 접근법입니다.

+0

그리고'sort_by'가 절대로 변경되지 않으면, 그것은 클래스의베이스에서 상수'SortBy'로 더 잘 작동 할 것입니다 : – Matchu

+0

'sort_by'는 변경 될 수 있기 때문에 상수 일 수 없습니다. 게다가, 당신의 코드에서'@ sort_by'는 각 액션 전에 설정 될 것입니다, 그러나 기본값 (': shop_brand')을 한 번만 설정하고 싶습니다! 'index' 메쏘드가 호출 될 때마다 디폴트 값을 설정하고 싶지 않습니다! –

+0

글쎄, 나는'@sort_by || = : shop_brand'을 할 수 있다고 생각하지만 매번'set_defaults'를 호출하지 않는 더 멋진 메소드가 있는지 궁금합니다. –

관련 문제