रूबी ऑन रेल्स: एक कैश किया गया पृष्ठ साफ़ करें


81

मेरे पास एक RoR एप्लीकेशन है (रूबी v1.8.7; रेल्स v2.3.5) जो विकास के माहौल में एक पृष्ठ को कैशिंग कर रही है। यह बहुत अधिक समस्या नहीं होगी, लेकिन कैश्ड पृष्ठ के aतत्व गलत हैं।

मैंने development.rb फाइल में कोई बदलाव नहीं किया है और मैंने जानबूझकर कंट्रोलर्स के लिए कोई कैशिंग कमांड नहीं जोड़ा है।

मैंने इस साइट (लोकलहोस्ट) के लिए ब्राउज़र (OSX पर फ़ायरफ़ॉक्स 3.5) कुकी और पेज कैश को साफ़ करने की कोशिश की है। मैंने भी मोंगरेल को पुनः आरंभ किया है। कुछ भी मदद नहीं लगती।

मैं क्या खो रहा हूँ?

जवाबों:


125

विकास में यह रेखा। सुनिश्चित करता है कि कैशिंग नहीं हो रहा है।

config.action_controller.perform_caching             = false

आप के साथ रेल कैश साफ़ कर सकते हैं

Rails.cache.clear

उस ने कहा - मुझे यकीन नहीं है कि यह एक कैशिंग मुद्दा है। क्या आप पृष्ठ में परिवर्तन कर रहे हैं और उन्हें परिलक्षित नहीं देख रहे हैं? आप शायद उस पृष्ठ का लाइव संस्करण नहीं देख रहे हैं? मैंने ऐसा एक बार (ब्लश) किया है।

अपडेट करें:

आप कंसोल में से उस कमांड को कॉल कर सकते हैं। क्या आप वाकई विकास में एप्लिकेशन चला रहे हैं?

एकमात्र विकल्प यह है कि जिस पृष्ठ को आप रेंडर करने की कोशिश कर रहे हैं वह वह पृष्ठ नहीं है जिसका प्रतिपादन किया जा रहा है।

यदि आप सर्वर आउटपुट देखते हैं, तो आपको रेंडर कमांड को देखने में सक्षम होना चाहिए जब पेज इस तरह से प्रस्तुत किया गया हो:

Rendered shared_partials/_latest_featured_video (31.9ms)
Rendered shared_partials/_s_invite_friends (2.9ms)
Rendered layouts/_sidebar (2002.1ms)
Rendered layouts/_footer (2.8ms)
Rendered layouts/_busy_indicator (0.6ms)

वह लाइन विकास .rb फ़ाइल में मौजूद है। मैं उस आदेश को कहां जोड़ूं? हाँ। मैंने उस पृष्ठ में परिवर्तन किए, जो प्रदर्शित होना चाहिए था यदि पृष्ठ 'लाइव' था - यह मैंने कैशिंग मुद्दे की खोज की है।
क्रेग

ऐसा प्रतीत होता है कि यह मेरी ओर से एक मूर्खतापूर्ण गलती थी। ब्लश आपके समय और सहायता के लिए धन्यवाद - मैंने बहुत कुछ सीखा।
क्रेग

कोई दिक्कत नहीं है। जानना चाहेंगे कि यह मुद्दा क्या था - ये बातें हमेशा बहुत अस्पष्ट होती हैं - सबसे ज्यादा जब आप एक मूर्खतापूर्ण गलती कर रहे होते हैं - मुझे लगता है कि मैं जल्द ही एक ही करने के लिए बाध्य हूं :)
Apie

1
मैंने दो संबंधित मॉडल के लिए नेस्टेड मार्ग हैं। एक पृष्ठ पर, मैं link_to में edit_parent_child_path का उपयोग करता हूं। दुर्भाग्य से, मैंने माता-पिता के संदर्भ को छोड़ दिया; यह edit_parent_child_path (बच्चा) था, इसे edit_parent_child_path (@ माता-पिता, बच्चे) की आवश्यकता थी।
क्रेग

"आप शायद उस पृष्ठ के लाइव संस्करण को नहीं देख रहे हैं? मैंने ऐसा एक बार (ब्लश) किया है।" LOL यह सिर्फ मेरे लिए हुआ है
रॉबर्ट वुनाबंडी

113

rake tmp:cache:clear वह हो सकता है जो आप खोज रहे हैं।


1
यदि पर्यावरण विकास के अलावा कुछ है तो आपको जोड़ने की आवश्यकता होगी (उदाहरण के लिए मंचन) - RAILS_ENV=staging bundle exec rake tmp:cache:clearअन्यथा मुझे लगता है कि यह काम नहीं करेगा
खराब

यह सिर्फ tmp / कैश डायरेक्टरी से फाइलों को हटा देगा। यह कैश स्टोर डेटा को साफ़ नहीं करेगा। stackoverflow.com/questions/19017983/…
ओशन विस्पररुमा

25

मैं अपनी संपत्ति कैश को साफ करके इस समस्या को हल करने में सक्षम था:

$ rake assets:clean

4

अपने पृष्ठ के एक स्थिर संस्करण के लिए / सार्वजनिक रूप से जाँच करें और यदि यह है तो इसे हटा दें। जब 3.x कैश पेजों को रेल करता है, तो यह आपके सार्वजनिक फ़ोल्डर में एक स्थैतिक संस्करण छोड़ देता है और उपयोगकर्ताओं द्वारा आपकी साइट पर हिट करने पर लोड करता है। आपके कैश साफ़ करने के बाद भी यह बना रहेगा।


रेल 4 में, /tmp/cache/निर्देशिका में स्थित कैश आइटम ।
इवान चाऊ

इसने मेरे लिए चाल चली। मुझे एक रेंडर पेज मिलता रहा जिसका उपयोग मैं कुछ नए कोड का परीक्षण करने के लिए कर रहा था। सर्वर कंसोल किसी भी नए पृष्ठों की रिपोर्ट नहीं कर रहा था जो मैं अनुरोध कर रहा था कि एक ही पाठ प्रस्तुत करना होगा। मैंने यह सोचकर अपना कैश साफ़ कर दिया कि यह मुद्दा था, लेकिन इससे कोई फायदा नहीं हुआ। मुझे सार्वजनिक फ़ोल्डर में पृष्ठ मिला, इसे हटा दिया गया, और अब ठीक से काम कर रहा है।
रीमुस क्लिंसमैन

2

यदि आप टुकड़ा कैशिंग कर रहे हैं , तो आप अपनी कैश कुंजी को अपडेट करके कैश को मैन्युअल रूप से तोड़ सकते हैं, जैसे:

संस्करण 1

<% cache ['cool_name_for_cache_key', 'v1'] do %>

संस्करण 2

<% cache ['cool_name_for_cache_key', 'v2'] do %>

या आपके पास कैश एक गैर-स्थिर ऑब्जेक्ट की स्थिति के आधार पर स्वचालित रूप से रीसेट हो सकता है, जैसे कि ActiveRecord ऑब्जेक्ट, जैसे:

<% cache @user_object do %>

इस ^ विधि के साथ, किसी भी समय उपयोगकर्ता ऑब्जेक्ट को अपडेट किया जाता है, कैश स्वचालित रूप से रीसेट हो जाएगा।


केवल विशिष्ट टुकड़े कैश के लिए परिवर्तनों के बाद क्या स्वचालित रूप से रीसेट होना चाहते हैं?
Astm

@Astm वह जगह है जहाँ आप अंतिम विकल्प का उपयोग करेंगे - आपके कैश कुंजी के हिस्से के रूप में एक एआर ऑब्जेक्ट है। जब updated_atसंशोधित किया जाता है, तो AR ऑब्जेक्ट अब कैश कुंजी से मेल नहीं खाएगा, जिससे टुकड़े को फिर से लगाया जाएगा।
jeffdill2

मुझे कैश को स्वचालित रूप से साफ़ करने का आसान तरीका मिला अगर कोई बदलाव सिंटैक्स <% कैश (['User_Cache', user_object], expires_in: 1.hour) का उपयोग करके किया जाए तो>%> अगर उपयोगकर्ता में कोई बदलाव होता है तो यह स्वतः ही अपडेट हो जाएगा कैश
Astm

1
@ सही, यह अंतिम विकल्प है जिसका मैंने उल्लेख किया है कि AR कुंजी का उपयोग कैश कुंजी के हिस्से के रूप में किया गया है।
jeffdill2

1

अधिक गूढ़ तरीके:

Rails.cache.delete_matched("*")

रेडिस के लिए:

Redis.new.keys.each{ |key| Rails.cache.delete(key) }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.