2010-06-21 3 views
0

여러 컨트롤러에 대해 필터를 사용하기 전에 클래스를 사용하려고합니다. 필터는 컨트롤러가 호출하는 컨트롤러에 따라 약간 다른 작업을 수행해야하기 때문에 필터를 전달하기 위해 컨트롤러를 가져 오기 위해 클래스를 필터로 사용해야하는 것처럼 보입니다. 에 before_filter 기사 행동과 이미지 컨트롤러를 보여필터 클래스에서 플래시 및 redirect_to에 액세스하는 방법

지금까지, 나는이이 클래스를 호출 할 것이다

class ShowFilter 
def self.filter(controller) 
    c_name = controller.controller_name 
    object_id = controller.params[:id] 
    case c_name 
    when "articles" 
     article = Article.find(object_id) 
     unless curr_user.can_see?(article) 
     controller.redirect_to(:controller => "articles", :action => "index") 
     end 
    when "images" 
     image = Image.find(object_id) 
     unless curr_user.can_see?(image) 
     controller.redirect_to(:controller => "images", :action => "index") 
     end 
    end 
end 

같은 것을 가지고있다.

내 문제는 'redirect_to'가 필터에 전달 된 모든 컨트롤러의 보호 된 메서드라는 오류가 발생한다는 것입니다.

내가

redirect_to(:controller => "images", :action => "index") 

대신

controller.redirect_to(:controller => "images", :action => "index") 

내가 얻을 호출하면 "ShowFilter에 대한 정의되지 않은 메서드 'redirect_to를'클래스 '오류가 발생했습니다.

내가

class ShowFilter < ApplicationController 

나의 클래스를 정의하면 난 아직 정의되지 않은 방법의 오류가 발생합니다. 플래시에도 액세스하는 것과 똑같은 문제를 겪고 있습니다.

필터 클래스 내부를 리디렉션 할 수있는 방법이 있습니까? 플래시를 리디렉션하고 액세스 할 수 있도록 필터링하기 위해 다른 방법을 사용해야합니까?

답변

1

메소드의 보호 수준을 우회하려면 controller.send (: redirect_to, "url")를 사용할 수 있습니다.

+0

감사합니다. Tanel. controller.send의 작동 방식에 관한 좋은 링크가 있습니까? 나는 여전히 플래시를 설정하려고하고 있는데, 나는 그것을 알아낼 수 없다. –

+0

Lookup Object # 루비 문서를 보냅니다. 레일 특유의 것이 아닙니다. – Senjai

관련 문제