2015-02-01 1 views
0

Ruby를 처음 사용했습니다. 난 레일 응용 프로그램을 가지고 있고 데이터베이스에 사이트 이름과 같은 사이트 구성을 유지하려고합니다. 나는 전화 할 수 있도록 도우미를 준비했습니다 : site_param 'site_name'. 도우미 응용 프로그램이 각 통화의 데이터베이스에 충돌하지 않도록 여기에, 변수에 데이터를 저장 보이는 방법은 다음과 같습니다 @params에 값이 저장되면Ruby에서 메모리 캐시를 지우는 방법은 무엇입니까?

 
module SiteHelper 
    class Site 
    def self.get(param) 
     @params = {} unless @params.kind_of?(Hash) 

     if @params[param].nil? 
     new_param = Site.find(param) 
     @params[param] = new_param 
     end 

     @params[param] 
    end 
    end 
end 

이제 문제는, 그렇지 않은 것을 다음 요청시 새로 고침. PHP 배경에서 오는이 싱글 톤의 종류는 각 요청마다 새로 고쳐 지므로 데이터베이스의 값을 편집하면 문제없이 새로 고쳐집니다. 루비에서는 @params이 캐시되고 서버를 다시 시작할 때까지 동일한 값을 유지합니다. 요청 수명 동안 만 @params을 유지하고 다음에 새로 고칠 수있는 방법이 있습니까?

답변

2

코드 문제는 클래스의 컨텍스트에서 인스턴스 변수를 사용한다는 것이므로 프로세스가 실행되는 동안 지속됩니다.

#get을 인스턴스 메서드로 변환하고 Site 클래스의 인스턴스를 다시 사용해야합니다. 당신이 루비에서 쓴 것은 확실히 싱글 톤과 같은 구현이 아닙니다.

module SiteHelper 
    def site 
    @site ||= Site.new 
    end 

    class Site 
    def get(param) 
     @params = {} unless @params.kind_of?(Hash) 

     if @params[param].nil? 
     new_param = Site.find(param) 
     @params[param] = new_param 
     end 

     @params[param] 
    end 
    end 
end 

# In the view 
site.get("whatever") 

코드를 루비 스타일로 개선 할 수도 있습니다. ||= 및 반환 값을 이용하여 #get을 구현합니다.

module SiteHelper 
    def site 
    @site ||= Site.new 
    end 

    class Site 
    def get(param) 
     @params ||= {} 
     @params[param] ||= Site.find(param) 
    end 
    end 
end 
+0

시몬. 나는 또한'|| ='에 대해서도 배웠다. –

관련 문제