【问题标题】:Destroy or set global variable to nil, once the browser is closed关闭浏览器后销毁或将全局变量设置为 nil
【发布时间】:2017-01-06 04:19:57
【问题描述】:

我在我的rails 应用程序控制器中将一个全局变量声明为$decrypted_attessec = "verified decrypted cookie",并且我正在我的所有控制器中访问它。关闭浏览器窗口后,必须将全局变量设置为 nil 或销毁,这还没有完成。

在我的情况下,它始终保持初始值 "verified decrypted cookie" 在这种情况下,但是,服务器重启会破坏全局变量并重新初始化它,我也想在关闭浏览器时完成。

我的代码:

application_controller.rb

 def validate_user
    $decrypted_attessec = "verfied decrypted cookie"
      #I am getting value of $decrypted_attessec as verfied decrypted cookie from different action which would be either an empty or non-empty string
    if !$decrypted_attessec.empty?
      #redirect_to clicked path
    else
      redirect_to "login url"
    end
  end

Welcome_controller.rb

if $decrypted_attessec.empty?
  before_action :validate_user, :except => [:index, :csplogin]
end

我的代码哪里出错了?

【问题讨论】:

  • Ruby on Rails 是无状态的,因此关闭浏览器将不起作用。全局变量通常被认为是一种不好的做法。听起来您可能想要一个会话变量?你想做什么?
  • 如果有很多浏览器连接到你的服务器,那么什么时候取消全局变量?
  • 检测浏览器何时关闭不是rails内置的,你需要使用AJAX或websockets。
  • 这听起来像xy problem 对我来说。你能解释一下你试图达到的目标吗?为什么您的应用程序需要知道用户何时关闭浏览器?
  • 看起来您正在尝试构建身份验证功能,并在应用程序中使用全局变量。那是对的吗?您是否知道在这种情况下多个用户可能共享同一个变量以及这可能如何影响应用的安全性?

标签: ruby-on-rails ruby browser global-variables


【解决方案1】:

首先,@global_variable 根本不是一个全局变量。实际上,它是您的类对象的实例变量。

其次,全局变量使用前面的$ 定义,例如$global_variable。请参阅this excellent post 了解更多关于使用全局变量的含义。

最后但并非最不重要的一点是,全局变量将不依赖于浏览器的关闭和打开。我建议您详细说明您的用例,以便更好地解决您的问题。

【讨论】:

    猜你喜欢
    • 2014-08-15
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 1970-01-01
    相关资源
    最近更新 更多