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配列はセッション全体で持続しているようです! 数分間更新しないと、自動的にリセットされます。

私が最初に考えたのは、なんらかのキャッシュが発生していることでしたが、Google からは何も得られませんでした。

4

2 に答える 2

3

まず、モデルのクラス変数には何も格納しないでください。クラス変数は一般的に悪い考えです。これは、関連するコントローラー ( のようなもの) のヘルパー ファイル内のビュー ヘルパー メソッドで実際に実行する必要があるようapp/helpers/articles_helper.rbです。

モデル クラス全体に対して、このようなものを保存する必要はありません。各インスタンスのデータを保存するか、アプリにハードコードします。

更新間で変数が保持される理由は、Rails がArticle(起動時に) クラスを 1 回ロードし、クラス変数が再作成されない (クラスがリロードされないため) ためです。

于 2012-09-04T22:13:29.127 に答える
1

クラス変数の代わりに単にインスタンス変数を使用することを検討してください。これは、そのクラスのオブジェクトの単一のインスタンスにのみ保持されるため、ページを更新すると、そのクラスのオブジェクトの新しいインスタンスが作成され、何も含まれません。過去価値)。@customTags

別の注意点として、モデルでこのような変数を定義することは一般的に不適切な方法と考えられています。対応するヘルパー ファイルを配置することを検討してください。

于 2012-09-04T22:16:13.313 に答える