2011-10-05 36 views
9

いいえRails.cache.fetchを使ってキャッシュを実装しています。しかし、ある特定のインスタンスでは、時々私は例外が発生します。Rails.cache.fetch例外:TypeError(<ModelName>は参照できません)

TypeError in EmloController#index 

Emlo can't be referred to 

app/controllers/emlo_controller.rb:320:in `get_employees' 
app/controllers/emlo_controller.rb:356:in `prepare_json_response' 
app/controllers/emlo_controller.rb:23:in `block (2 levels) in index' 
app/controllers/emlo_controller.rb:15:in `index' 

フェッチは、常に最初の試行で(上で)爆発し、その後限りフェッチが有効期限内であると正常に動作しますようです。私は何かが欠けていることを知っているので、新鮮な目のペアがいいでしょう。ここで

は、キャッシュがフェッチ呼び出す方法があります:

def get_employees 

    # This is for a AJAX refresh loop, so a 5-second cache actually helps quite a bit 
    Rails.cache.fetch('emlo_all', :expires_in => 5.seconds, :race_condition_ttl => 1) do 

    conditions = (params[:id]) ? {:user_id => params[:id]} : nil 

    selections = [ 
     'employee_locations.id AS emlo_id', 
     'employee_locations.status_id', 
     'employee_locations.notes', 
     'employee_locations.until', 
     'employee_locations.updated_at', 
     'employee_locations.user_id', 
     'location_states.id AS state_id', 
     'location_states.title AS status_string', 
     'location_states.font_color', 
     'location_states.bg_color', 
     'users.displayname', 
     'users.email', 
     'users.mobile', 
     'users.department', 
     'users.extension', 
     'users.guid', 
     'users.dn' 
    ].join(', ') 

    Emlo.all(
     :select => selections, 
     :joins => 'LEFT JOIN users ON employee_locations.user_id=users.id LEFT JOIN location_states ON employee_locations.status_id=location_states.id', 
     :conditions => conditions, 
     :order => 'users.displayname ASC' 
    ) 
    end 
end 
+0

が必要です。今はうまくいくと思われますが、私は経験した例外について誰か他の人が何か言いたいことを学ぶことに興味があります。 –

+0

私はこれを 'Rails.cache.write()'と '.read()'で今度だけ再度実行しました: "' TypeError(は参照できません) '" –

+0

ロードされるEmloクラス、またはレールはmemcacheに含まれているものを逆シリアル化する方法を知らない。 –

答えて

12

ときconfig.action_controller.perform_caching = trueconfig.cache_classes = falseこの問題は、開発モードで発生 - ActiveRecordのオブジェクトはRails.cacheに保存することができないようです。

しかし、キャッシュをテストするために開発モードでconfig.action_controller.perform_cachingを有効にする必要がある場合は、config.cache_classesも有効にする必要があります。ただし、これは一時的なものです。なぜなら、アセットパイプラインのクラスやファイルを変更した後に開発サーバーを再起動する必要があるからです。

キャッシングが無効の場合、開発時にキャッシングが発生しないように、Rails.cache.write(some_name, some_value) if Rails.env.production?を使用します。 Rails.cache.read()は影響を受けていないようです。

-1

アプリケーションの構造によっては、このように開発中のエラーを受け取ることがあります はTypeErrorを(ユーザーが参照することはできません) このエラーは、いくつかのキャッシュリロード狂気によって引き起こされる:いくつかの宝石によって注入ミドルウェアキャッシュされます。しかし、開発では、あなたのクラスは通常ではありません。したがって、一部のクラスは特定の状況下では利用できない場合があります。エンジンによって提供されるユーザ認証のためにフィルタの前に使用している場合。上記のエラーを取り除くには、クラスキャッシングをオンにする必要があります。それを試してみてください(そしてその後、サーバーを再起動します):

development.rb

エラーがなくなっている場合は、運がよけれ

config.cache_classes =。しかし、開発中にクラスをキャッシュすることは現実的ではないので、クラスキャッシングをもう一度オフにし、参照できなかったクラスを明示的に必要とします。 IE:development.rb

トップ今のところ、私は最終的に、このメソッドを呼び出して、アクションの `caches_action`を実行することを決定しましたが、まあ「アプリ/モデル/ユーザー

関連する問題