我可以在一次使用后“卸载”Rails Metal Class吗?

时间:2009-09-01 14:15:34

标签: ruby-on-rails

我有一个Rails金属类,基本上只进行一次检查以确保系统中有管理员用户,如果没有,它会重定向用户创建一个。现在我正在使用机架会话来防止双重检查,但这似乎有以下问题:

  • 仍然会对每个会话进行一次检查
  • 首先检查会话,以减慢速度。

我想知道是否有可能指示Rails从链中“删除”或“卸载”该类。这可以安全地完成吗?还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

最简单的解决方案(虽然不是很干净)是存储管理员用户存在于类中的事实。

class EnsureAdminUser
  def self.call(env)
    if @admin_defined or Admin.any?
      @admin_defined = true
      [404, {"Content-Type" => "text/html"}, "Not Found"]
    else
      …
    end
  end
end

这可以节省每个请求的数据库命中率。

要真正删除金属,你需要做一些更激进(和邪恶)的事情:

ObjectSpace.each_object(Rails::Rack::Metal){|metal_handler|
  metal_handler.instance_eval{ @metals.delete(EnsureAdminUser) }
}