2011-10-05 13 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' 

यह (ऊपर) के साथ लाने हमेशा विस्फोट हो जाएगा लगता है पहली कोशिश में, और उसके बाद ठीक से काम जब तक लाने समाप्ति के भीतर है । मुझे पता है कि मुझे कुछ याद आ रहा है, इसलिए आंखों की एक ताजा जोड़ी अच्छी होगी। - ऐसा लगता है ActiveRecord वस्तुओं Rails.cache के साथ संग्रहीत नहीं किया जा सकता

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

खैर, अब के लिए, मैं सिर्फ कार्रवाई जो अंततः इस विधि कॉल पर एक 'caches_action' प्रदर्शन करने के लिए तय कर लिया है । अब के लिए ठीक काम करने लगता है, लेकिन मुझे अभी भी सीखने में दिलचस्पी है कि मुझे किसी अपवाद के बारे में क्या कहना पड़ सकता है। –

+0

मैं अभी इस बार फिर से चला गया, केवल इस समय 'Rails.cache.write()' और '.read()': "टाइपरर ( को संदर्भित नहीं किया जा सकता है) ' –

+0

लगता है जैसे आपको मजबूर होना चाहिए एम्लो वर्ग को लोड किया जाना चाहिए या अन्य रेलों को पता नहीं है कि memcache में क्या deserialize करने के लिए। –

उत्तर

12

यह समस्या विकास मोड में पैदा होती है जब config.action_controller.perform_caching = true और config.cache_classes = false:

यहाँ विधि है जो invokes कैश लाने है।

लेकिन यदि आपको कैशिंग परीक्षण के लिए विकास मोड में config.action_controller.perform_caching सक्षम करने की आवश्यकता है, तो आपको config.cache_classes भी सक्षम करना होगा। हालांकि, यह अस्थायी होगा, क्योंकि तब आपको संपत्ति पाइपलाइन में कक्षाओं या फ़ाइलों को बदलने के बाद विकास सर्वर को पुनरारंभ करना होगा।

कैशिंग अक्षम होने के साथ, मैं कैशिंग को विकास में उड़ने से रोकने के लिए Rails.cache.write(some_name, some_value) if Rails.env.production? का उपयोग करूंगा। Rails.cache.read() प्रभावित नहीं लग रहा है।

-1

आपके आवेदन की संरचना पर निर्भर करता है, तो आपको एक त्रुटि विकास में इस तरह मिल सकता है: लेखन त्रुटि (उपयोगकर्ता नहीं भेजा जा सकता) यह त्रुटि कुछ कैशिंग-पुन: लोड पागलपन के कारण होता है: मिडलवेयर कुछ मणि द्वारा प्रत्यारोपित कैश किया गया है लेकिन विकास में, आमतौर पर आपकी कक्षाएं नहीं होती हैं। इस प्रकार कुछ कक्षाएं कुछ परिस्थितियों में उपलब्ध नहीं हो सकती हैं, उदा। यदि आप कुछ इंजन द्वारा प्रदान किए गए उपयोगकर्ता प्रमाणीकरण के लिए फ़िल्टर से पहले उपयोग कर रहे हैं। आपको क्लास कैशिंग चालू करके उपरोक्त त्रुटि से छुटकारा पाने में सक्षम होना चाहिए। यह प्रयास करें (और बाद में सर्वर को पुनः आरंभ):

development.rb

config.cache_classes = सच

त्रुटि चला गया है, तो आप भाग्यशाली हैं। लेकिन चूंकि विकास में कक्षाओं को कैश करना संभव नहीं है, फिर से कक्षा कैशिंग को बंद कर दें और स्पष्ट रूप से उस कक्षा की आवश्यकता हो जिसे संदर्भित नहीं किया जा सके। आईई:

development.rb के शीर्ष

की आवश्यकता होती है 'ऐप्लिकेशन/मॉडल/उपयोगकर्ता

संबंधित मुद्दे