2012-11-09 1 views
0

로컬로 테스트하고 있습니다. 내 ip는 127.0.0.1입니다. ip_permissions 테이블은 비어 있습니다. 사이트를 탐색하면 모든 것이 예상대로 작동합니다.Routes.rb가 캐시에서 IP를로드하지 않는 이유는 무엇입니까?

이제 금지 된 IP로 사이트를 탐색하려고합니다. 그래서 IP를 ip_permissions 테이블에 다음과 같이 추가합니다.

IpPermission.create!(:ip => '127.0.0.1', :note => 'foobar', :category => 'blacklist') 

레일즈 콘솔에서 캐시를 통해 지 웁니다. Rails.cache.clear. 나는 사이트를 둘러 본다. 나는 pages#blacklist로 보내지 않습니다.

서버를 다시 시작하는 경우. 사이트를 탐색하면 pages#blacklist으로 전송됩니다. 왜 ip_permissions 테이블이 업데이트 될 때마다 서버를 다시 시작해야합니까? 캐시를 기반으로 가져 오면 안됩니까? 당신은 시작시 한 번만로드하여 루트 파일에 BlacklistConstraint을 초기화하는

class IpPermission < ActiveRecord::Base 
    validates_presence_of :ip, :note, :category 
    validates_uniqueness_of :ip, :scope => [:category] 
    validates :category, :inclusion => { :in => ['whitelist', 'blacklist'] } 

    def self.whitelist 
    Rails.cache.fetch('whitelist', :expires_in => 1.month) { self.where(:category => 'whitelist').all } 
    end 

    def self.blacklist 
    Rails.cache.fetch('blacklist', :expires_in => 1.month) { self.where(:category => 'blacklist').all } 
    end 
end 

답변

2

: 같은

class BlacklistConstraint 
    def initialize 
    @blacklist = IpPermission.blacklist 
    end 

    def matches?(request) 
    @blacklist.map { |b| b.ip }.include? request.remote_ip 
    end 
end 

Foobar::Application.routes.draw do 
    match '/(*path)' => 'pages#blacklist', :constraints => BlacklistConstraint.new 
    .... 
end 

내 모델은 같습니다처럼

경로를 찾습니다. 여기서 IpPermission.blacklist를 호출하여 인스턴스 변수에 저장합니다. Initialize가 더 이상 호출되지 않으므로 동일한 레코드를 검사합니다.

class BlacklistConstraint 
    def blacklist 
    IpPermission.blacklist 
    end 

    def matches?(request) 
    blacklist.map { |b| b.ip }.include? request.remote_ip 
    end 
end 
: 당신이 그 (것)들을 업데이트 할 경우

각 요청에 대한 기록을로드해야합니다

관련 문제