Rails rails 中类变量的问题

macknight · 2015年03月04日 · 最后由 MrPasserby 回复于 2015年03月06日 · 2548 次阅读

按理说,类变量在不同请求之间是共享的。但是我发现只有在 instance method 做的修改才符合我的预期。

也就是一个 instance 方法去修改类变量,然后另一个 instance 方法去读取这个类变量时是修改后的值。

但是如果在 class method 中修改类变量,在另一个 class method 中读取却还是旧的值。

这是为何?

怎么做可以使 class method 做的修改,另一个 class method 读取时也是修改后的值?

你还有什么补充吗?

#1 楼 @Rei 额,其实我想问的是另一个问题。。改了下问题

持久性递增的方案:

  1. Rails.cache
  2. Redis
  3. Database

#3 楼 @Rei 不过那个问题还是没有解答。。。这是因为不同类方法去一个去修改类变量时,一个去读取时,读取的值不是修改的值,这是为何?

#4 楼 @macknight 开了几个进程?代码呢?

贴代码,不贴代码的提问都是耍流氓

#5 楼 @Rei 测试代码。。 class HelloController @@flag = false def self.test1 @@flag = true p @@flag end

def self.test2 p @@flag end end

然后我在 rails c 中运行 HelloController.test1 打印是 true 然后我新开一个终端 tab rails c 之后 HelloController.test2 还是 false

这是为何?按理说不该是 true 了吗?

#6 楼 @blacktulip 测试代码 class HelloController @@flag = false def self.test1 @@flag = true p @@flag end

def self.test2 p @@flag end end

然后我在 rails c 中运行 HelloController.test1 打印是 true 然后我新开一个终端 tab rails c 之后 HelloController.test2 还是 false

这是为何?按理说不该是 true 了吗?

#8 楼 @macknight 新开终端不就重新初始化了么,为啥要新开终端

#9 楼 @blacktulip 我如果放在成员方法里就不会,然后在不同 tab 里用 curl 去调用成员方法,这样是好的

#10 楼 @macknight 放「成员方法」里面的代码是怎么样的?

我觉得你这样测试有问题,应该写个 view 读一下 flag 的值。新开的终端应该和端进程不一样。

#11 楼 @blacktulip @@flag = true render text: @@flag

#13 楼 @macknight

终端 A 和终端 B 是两个进程。

rails s 是一个进程。

你试试 rails s -p 3000rails s -p 4000,3000 和 4000 端口的两个网页是不是同一个值?

#14 楼 @Rei 我做了个新的实验,https://ruby-china.org/topics/24488,结果打印出的类变量的值一会有,一会没有。。。

一个问题别开两贴。

@@ACCESS_TOKEN@@JS_API_TICKET 哪里来的,明显要看这两个东西怎么设置的啊。

楼主请把整个 project 推上 github,然后详细描述一下我们 clone 下来以后应该如何一步一步重现你的问题。

#15 楼 @macknight 第一个方法的类变量是@@my_logger,第二个方法是@@ACCESS_TOKEN, @@JS_API_TICKET,突然多了两个变量,你在哪里赋值,其他地方有没有改过我都不知道啊。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号