在rails中更改全局变量的值

时间:2015-12-11 18:43:46

标签: ruby-on-rails

我正在为一个应用程序进行原型设计,并希望有一个全局变量,我可以点击一个切换全局变量$ current_status的端点。我有:

  def toggle_status
     $current_status=false if $current_status.nil?
     $current_status=!$current_status
     r={}
     r[:current_status]=$current_status
     render json:r.to_json
  end

并在application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery with: :exception
  $current_status
end

但是hitting / toggle_status总是返回false。为什么不指定bool来改变这个值呢?我知道这样的事情应该在数据库中,但只是原型设计

编辑1

我刚刚在lib /

中创建了这个
class Jt
  @cur
  def self.cur
    @cur
  end

  def self.cur=val
    @cur=val
  end
end

并将控制器更新为:

  def toggle_status
     Jt.cur=!Jt.cur
     r={}
     r[:current_status]=Jt.cur
     render json:r.to_json
  end

3 个答案:

答案 0 :(得分:1)

您的切换代码实际上并未切换任何内容。您似乎希望此行“切换”$current_status变量的内容。

$current_status!=$current_status

但是,!=运算符不会分配任何内容,但它是一个比较运算符。在您的情况下,根据您的查询,它始终会false返回$current_status是否等于not $current_status

您想要使用的可能是

$current_status = !$current_status

至于你的软件设计,全局变量在Ruby(和Rails)中通常都是不受欢迎的,因为所有其他类型的全局可变状态都是如此。使用适当的类和对象来将您的状态和行为封装到更易于管理的结构中。使用全局变量,你有一天在脚下射击自己,你将很难找到实际发生的事情。你应该尽量避免这种情况:)

答案 1 :(得分:0)

在这样的应用程序中,您不能以这种方式使用全局变量,并且有几个原因。我只给你一个:根据你使用的网络服务器,服务器可以启动不同的进程来处理传入的Web请求,并且不能在这些进程之间共享全局变量。

事实上,根本不使用全局变量也不是一个好主意。

如果要保持状态,请使用适当的存储空间。根据值应该保持多长时间以及谁应该能够访问它,您有很多选择:

  • 数据库
  • 文件系统
  • 存储器
  • 饼干

答案 2 :(得分:0)

您的第一个修补程序不起作用,因为!=是比较运算符,而不是赋值

第二个可能由于代码重新加载而无效(Jt类实例不能保证与其他请求相同,除非cache_classes打开,但在开发过程中,您通常总是希望它关闭,否则任何代码更改都需要服务器重启才能生效),有一个非重载类的简单方法 - 将它放在初始化程序中

对于原型设计,您还可以尝试线程本地存储来完成此任务:Thread.current[:foo] = 1234