【问题标题】:Why is Routes.rb not loading the IPs from cache?为什么 Routes.rb 没有从缓存中加载 IP?
【发布时间】:2012-11-09 10:44:39
【问题描述】:

我正在本地测试这个。我的 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

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 memcached


    【解决方案1】:

    您在路由文件中初始化 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2012-05-08
      • 2015-06-24
      • 1970-01-01
      • 2021-05-01
      相关资源
      最近更新 更多