我在当地测试这个。我的IP是127.0.0.1
。 ip_permissions表为空。当我浏览网站时,一切都按预期工作。
现在,我想模拟使用禁止的IP浏览网站。所以我通过以下方法将IP添加到ip_permissions表中:
IpPermission.create!(:ip => '127.0.0.1', :note => 'foobar', :category => 'blacklist')
在Rails控制台中,我通过以下方式清除缓存; Rails.cache.clear
。我浏览网站。我没有收到pages#blacklist
。
如果我重新启动服务器。然后浏览网站,然后我收到pages#blacklist
。为什么每次更新ip_permissions表时都需要重启服务器?它不应该根据缓存获取它吗?
路线看起来像:
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
我的模型看起来像:
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
答案 0 :(得分:2)
您正在路线文件中初始化BlacklistConstraint,该文件在开始时仅加载一次。在那里,您调用IpPermission.blacklist并将其存储在实例变量中。不再调用Initialize,因此您将检查相同的记录。
如果您希望更新每个请求,您应该加载记录:
class BlacklistConstraint
def blacklist
IpPermission.blacklist
end
def matches?(request)
blacklist.map { |b| b.ip }.include? request.remote_ip
end
end