Conditional Page Caching [Solution: Conditional Fragment Caching]

后端 未结 3 881
-上瘾入骨i
-上瘾入骨i 2021-01-12 08:36

Suppose that I have controller home_controller.rb with action index.

I want to cache index page so I\'m doing:

caches_page          


        
相关标签:
3条回答
  • 2021-01-12 09:23

    cache_if and cache_unless seems to be the correct way to do this now:

    cache_if(condition, name = {}, options = nil, &block)
    cache_unless(condition, name = {}, options = nil, &block)
    

    Your code:

    <% cache_unless @user.changed?, [ @user, 'form' ] do %>

    0 讨论(0)
  • 2021-01-12 09:23

    What you want couldn't be achieved;

    A page is cached or is not cached. The process checks the existence of a html file or process it.

    Still you have two alternatives:

    • use action caching or fragment caching (not recommended)

    • more recommended: load user specific part with ajax so you'll only have one page always cached and specific data inserted dynamically (like stackoverflow)

    Here are state of the art explanations: http://railslab.newrelic.com/scaling-rails

    0 讨论(0)
  • 2021-01-12 09:24

    The accepted answer is now out of date, as conditional caching is now available in Rails 4. A pull request was merged into 4.0.0rc1 that allows for :if and :unless parameters to be passed to cache. This allows templates to be DRY, since there is no longer a need to duplicate the conditionally cached block.

    Usage:

    <% cache [ @user, 'form' ], :unless => @user.changed? do %>
      <%= render partial: 'shared/error_messages', locals: {instance: @user} %>
      <%= form_for @user do |f| %>
        <div class="field">
          <div><%= f.label :name %></div>
          <div><%= f.text_field :name %></div>
        </div>
        <div class="actions">
          <%= f.submit %>
        </div>
      <% end %>
    <% end %>
    
    0 讨论(0)
提交回复
热议问题