Rails中的类变量在浏览器刷新时持续存在

时间:2012-09-04 22:02:10

标签: ruby ruby-on-rails-3

从很长的PHP背景来看,我对Ruby和Rails很陌生。我得到了一个奇怪的错误让我感到难过。

我有一个类变量设置如下:

class Article < ActiveRecord::Base

    @@customTags = []

    def self.addCustomGA(slot, name, value, scope=3)
        h = {:slot => slot, :name => name, :value => value, :scope => scope}
        @@customTags.push h

    end

    def self.customTagOutput

        tags = ""
        @@customTags.each do |ct|
        tags << "_gaq.push(['_setCustomVar', "+ct[:slot].to_s+", '"+ct[:name].to_s+"', '"+ct[:value].to_s+"', "+ct[:scope].to_s+"]);\n"
        end
        tags
    end

end

我正在我的控制器中运行一个小测试:

Article.addCustomGA(1, 'categories', @article.category_list);

然后在我的HAML视图中,我输出的内容如下:

#{Article.customTagOutput}

这首先很有用。但是当我刷新页面时,它会不断向数组中添加一个条目 - 所以@@customTags数组似乎在我的会话中持续存在!如果我不刷新几分钟,那么它会自行重置。

我的第一个想法是发生某种缓存事件,但谷歌没有为我提供任何东西。

2 个答案:

答案 0 :(得分:3)

首先,不要在模型中的类变量中存储任何内容。类变量通常是个坏主意。这看起来应该在相关控制器的助手文件中的视图助手方法中完成(类似app/helpers/articles_helper.rb)。

您不需要为整个模型类存储这样的内容。您可以存储每个实例的数据,也可以将其硬编码到应用程序中。

在刷新之间保持变量的原因是Rails加载Article类一次(启动时)并且不会重新创建类变量(因为类没有重新加载)。

答案 1 :(得分:1)

考虑只使用实例变量而不是变量,@customTags只会在单个实例中保留该类的一个对象,因此如果你要刷新页面,那么将创建该类对象的新实例并且不包含先前的值。)

另一方面,在模型中定义这样的变量通常被认为是不好的做法,考虑放入相应的辅助文件。