2013-07-03 6 views
27

मैं रेल की कैशिंग क्षमताओं का उपयोग करने की कोशिश कर रहा हूं, लेकिन मैं कुछ कैश खंड समाप्त करने में असमर्थ हूं, हालांकि वे समाप्त होने लगते हैं। 'रूसी गुड़िया कैशिंग' के रूप में रेल में बताया ट्यूटोरियल साइट का उपयोग करना, मैं इस विन्यासरेल 4.0 expire_fragment/कैश की समाप्ति काम नहीं कर रही

<% cache "all_available_releases" do %> 
<% @releases.each do |release| %> 
    <% cache(release) do %> 
    <html code with> 
    <%ruby code @release.name blah blah blah%> 
    <%end%> 
<%end%> 
<%end%>  

मैं release_controller.rb नियंत्रक, जहां मैं expire_fragment का उपयोग करें ("all_available_releases") में बाहरी कैशिंग समाप्त करने के लिए उपयोग कर रहा हूँ टुकड़े की समाप्ति करें। मैं इसे नियंत्रक की हर विधि में उपयोग करता हूं जो एक प्रविष्टि को अद्यतन या हटा देता है या जोड़ता है।

यह वेबब्रिक का लॉग है, जहां समाप्ति खंड पंजीकृत हो जाता है, 5 लाइन बाद में समाप्त हो गया खंड पढ़ा जाता है और इसका उपयोग नहीं किया जाता है। यह उदाहरण एक नष्ट कॉल के बाद है।

Processing by ReleasesController#destroy as HTML 
    Parameters: {"authenticity_token"=>"***/***/********************+********=", "id"=>"2"} 
    Release Load (0.1ms) SELECT "releases".* FROM "releases" WHERE "releases"."id" = ? LIMIT 1 [["id", "2"]] 
    (0.1ms) begin transaction 
    SQL (2.0ms) DELETE FROM "releases" WHERE "releases"."id" = ? [["id", 2]] 
    (148.0ms) commit transaction 
Expire fragment views/all_available_releases (0.1ms) 
Redirected to http://127.0.0.1:3000/releases 
Completed 302 Found in 180ms (ActiveRecord: 150.2ms) 


Started GET "/releases" for 127.0.0.1 at 2013-07-03 13:09:51 +0300 
Processing by ReleasesController#index as HTML 
Read fragment views/all_available_releases/41cb0a928326986f35f41c52bb3d8352 (0.1ms) 
    Rendered releases/index.html.erb within layouts/application (0.6ms) 
Completed 200 OK in 5ms (Views: 4.0ms | ActiveRecord: 0.0ms) 

मैं भी Rails.cache.delete("all_available_releases") उपयोग करने की कोशिश और यह या तो काम नहीं किया।

अगर मैं अपने html.erb से <%cache "all_available_releases"%> (और एक <%end%>) हटा देता हूं तो कैशिंग ठीक काम करता है और जब भी इसे समाप्त हो जाता है तो समाप्त हो जाता है।

उत्तर

57

मेरा मानना ​​है कि मुद्दा यह है कि जब आप अपने ध्यान में रखते हुए टुकड़ा कैश, एक कैश डाइजेस्ट कैश कुंजी जोड़ा जा रहा है (विचारों/all_available_releases/41cb0a928326986f35f41c52bb3d8352), लेकिन expire_fragment डाइजेस्ट (विचारों/all_available_releases उपयोग नहीं कर रहा है)।

यदि आप दृश्य में कैश कॉल में skip_digest: true जोड़ते हैं तो इसे पाचन को उपयोग करने से रोकना चाहिए।

<% cache "all_available_releases", skip_digest: true do %> 
<% @releases.each do |release| %> 
    <% cache(release) do %> 
    <html code with> 
    <%ruby code @release.name blah blah blah%> 
    <%end%> 
<%end%> 
<%end%> 

कैश डाइजेस्ट का उपयोग केवल स्वचालित कैश समाप्ति के साथ किया जाना है। यदि आपको कैश कुंजी मैन्युअल रूप से समाप्त करने की आवश्यकता है तो आप कैश डाइजेस्ट का उपयोग नहीं कर सकते हैं।

+1

यह मेरी समस्या थी, धन्यवाद। –

+0

इससे मुझे बहुत परेशानी हुई। धन्यवाद! – Finbarr

+2

धन्यवाद, यह कहां दस्तावेज है? – bonyiii

4

जेबिल्डर skip_digest का समर्थन नहीं करता है। कई असफल दृष्टिकोणों के रास्ते के बाद, मैंने अपने उत्तरों को यहां साझा करने का फैसला किया क्योंकि यह अत्यधिक संबंधित है, हालांकि ऊपर के मुद्दे के रूप में रेल दृश्य के साथ नहीं।

यहां एक संबंधित प्रश्न/मुद्दा है जहां डीएचएच अनिवार्य रूप से उस लड़के को बताता है कि वह स्पष्ट रूप से fragment_caches की अवधि समाप्त नहीं कर सकता है। https://github.com/rails/cache_digests/issues/35 सब कुछ इसलिए यहाँ वर्ग नहीं है इस के चारों ओर एक तरीका है:

class MenuController 
    def index 
    json = Rails.cache.fetch('clients') do 
     @items = Menu.all 
     render_to_string(template: 'menu/index', locals: {items: @items}) 
    end 
    render json: json 
    end 
end 

तो आप explictly इस कहीं भी एक पर्यवेक्षक

class MenuCacheObserver < ActiveRecord::Observer 
    observe :menu, :menuitem, :menusubnavigation 

    def after_save obj 
    Rails.cache.delete(:clients) 
    end 
end 

में समाप्त हो सकता है कुछ मामलों इस अर्थपूर्ण हो सकता है जैसे,। एक सामान्य नोट पर, ज्यादातर मामलों में आपको कैश इनपुट में ऑब्जेक्ट का उपयोग करना चाहिए, जैसे json.cache! @my_object do जेबिल्डर व्यू को लपेटना। इस तरह ऑब्जेक्ट परिवर्तनों पर update_at जब यह अमान्य हो जाएगा।

+0

ऐसा लगता है कि jbuilder अब skip_digest का समर्थन करता है (मैं 2.4.0 का उपयोग कर रहा हूं) - निम्नलिखित मेरे लिए 'json.cache! ['v1', my_obj.cache_key], skip_digest: true, expires_in: 6.hours json.partial करें! 'पथ/से/मेरा/आंशिक', obj: my_obj end' – MaximusDominus

0

बस इस मुद्दे में खुद भाग गया और जिस तरह से मैंने उससे संपर्क किया, नियमित अभिव्यक्तियों के माध्यम से था। यह सबसे सुरुचिपूर्ण समाधान नहीं हो सकता है लेकिन यह ठीक काम करता है।

ActionController::Base.new.expire_fragment(%r{offer_#{@offer.id}/*}) 

skip_digest जोड़ना हालांकि बहुत अच्छा है।

0

रेल 5 में मैंने skip_digest: true का उपयोग किए बिना कैश को बस्ट करने के लिए निम्नलिखित कदम उठाए।हमारी समस्या यह थी कि I18n स्ट्रिंग्स के मान को बदलने से गणना की गई कैश पचाने में प्रतिबिंबित नहीं होता है ताकि कैश स्वचालित रूप से बस्ट नहीं हो सके।

/ views/layouts/_footer.html.slim 
- cache :footer do 
    span= t('shared.footer') 

फिर रेल कंसोल में मैं चलाएँ::

fragment = ActionController::Base.new.view_context.cache_fragment_name(:footer, virtual_path: 'layouts/_footer.html.slim') 
ActionController::Base.new.expire_fragment(fragment) 

cache_fragment_namevirtual_path कीवर्ड तर्क के आधार पर डाइजेस्ट यह पता लगाने जाएगा

यहाँ दृश्य जहां कैश ब्लॉक परिभाषित किया गया है है।

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