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数组似乎在我的会话中持续存在!如果我几分钟不刷新,它就会自行重置。

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

4

2 回答 2

3

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

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

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

于 2012-09-04T22:13:29.127 回答
1

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

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

于 2012-09-04T22:16:13.313 回答