从很长的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
数组似乎在我的会话中持续存在!如果我不刷新几分钟,那么它会自行重置。
我的第一个想法是发生某种缓存事件,但谷歌没有为我提供任何东西。
答案 0 :(得分:3)
首先,不要在模型中的类变量中存储任何内容。类变量通常是个坏主意。这看起来应该在相关控制器的助手文件中的视图助手方法中完成(类似app/helpers/articles_helper.rb
)。
您不需要为整个模型类存储这样的内容。您可以存储每个实例的数据,也可以将其硬编码到应用程序中。
在刷新之间保持变量的原因是Rails加载Article
类一次(启动时)并且不会重新创建类变量(因为类没有重新加载)。
答案 1 :(得分:1)
考虑只使用实例变量而不是类变量,@customTags
只会在单个实例中保留该类的一个对象,因此如果你要刷新页面,那么将创建该类对象的新实例并且不包含先前的值。)
另一方面,在模型中定义这样的变量通常被认为是不好的做法,考虑放入相应的辅助文件。