2010-03-01 11 views
7

컨트롤러 메서드간에 배열을 공유하고 다른 컨트롤러의 페이지를 다시로드하거나 호출 할 때까지이 메서드를 저장할 수 있습니까? 일부 메소드는 배열을 변경해야합니다. 당신은 다음 같은 컨트롤러 인스턴스의 메소드를 통해 값을 공유하려는 경우컨트롤러 메서드간에 값을 전달하는 방법

답변

5

이 인스턴스 변수를 선언 :

class BarsController < UsersController 

    before_filter :init_foo_list 

    def method1 
    render :method2 
    end 

    def method2 
    @foo_list.each do | item| 
     # do something 
    end 
    end 

    def init_foo_list 
    @foo_list ||= ['Money', 'Animals', 'Ummagumma'] 
    end 

end 

당신이 다음 세션 withn 두 개의 컨트롤러에서 값을 공유하려는 경우 :

class BarsController < UsersController 

    before_filter :init_foo_list 

    def method1 
    render :controller => "FoosController", :action => "method2" 
    end 

    def init_foo_list 
    params[:shared_param__] ||= ['Money', 'Animals', 'Ummagumma'] 
    end  
end 

class FoosController < UsersController 

    def method2 
    params[:shared_param__].each do | item| 
     # do something 
    end 
    end 
end 

기존 키와의 충돌을 피하기 위해 공유 매개 변수 키에 고유 한 이름을 지정하십시오.

다른 옵션은 공유 배열을 세션 광고에 저장하여 마지막 렌더링 전에 삭제하는 것입니다.

+0

attr_accessor는 클래스 인스턴스 전체에서이 변수에 액세스 할 수 있음을 의미합니다. 흠 .. 나는 이것을 시험해 볼 것이다! 감사! – Antiarchitect

+0

첫 번째 방법은 작동하지 않습니다. foo_list는 method2에서 nil입니다. 하지만 첫 번째 메서드는 두 번째 메서드보다 먼저 호출됩니다. 그리고 foo_list를 메소드에 없지만 초기화 할 때 어떻게 정의 할 수 있습니까? DEF [ '동물'돈 ','Ummagumma '] self.foo_list = 초기화 이와 단부 또는 다른 방법 으로든? – Antiarchitect

+1

'before_filter'에 값을 설정하십시오. –

6

레일 캐시를 사용할 수 있습니다.

Rails.cache.write("list",[1,2,3]) 
Rails.cache.read("list") 
+1

당신의 방법은 작동하는 것 같습니다! Rails.cache에 대한 좋은 문서를 찾지 못했습니다. 제게 링크를 제공해주세요. – Antiarchitect

+3

하지만 다른 세션의 값이 다른 경우 어떻게됩니까? –

+1

두 번째'토니 (Tony) '. 세션 전체에서 'list'이름의 고유성을 보장하지 않는 한이 솔루션은 동시 요청 중에 실패합니다. –

1

내 대답은 귀하의 요구 사항에 가까운인지 잘 모르겠지만, 나는 그 값에 하나의 컨트롤러 액션과 기준에 페치 개체/모델의 값을 얻으려면이 내가 할 것입니다 다른 컨트롤러 액션에서 다른 값을 가져와야합니다.

그것이 도움이되기를 바랍니다

@pages=Post.find.all` 

@@[email protected](any manipulations) 
지금

@@my_vales는 해당 컨트롤러의 조치에 사용할 수 있습니다 .. : 나는 클래스 변수를 사용합니다 및 예를 들어 내 컨트롤러 액션

전반에 걸쳐 사용 ...

관련 문제