2011-05-30 8 views
6

Supongamos que tengo el controlador home_controller.rb con la acción index.Caché de página condicional [Solución: Almacenamiento en caché de fragmento condicional]

quiero para almacenar en caché página de índice, así que estoy haciendo:

caches_page :index 

pero que él quiere almacenar en caché sólo para los usuarios que no están firmados en Si voy a hacer condicional como:.

caches_page :index, :if => :user_not_signed_in? 

La página se almacenará en caché mientras el primer usuario que no haya iniciado sesión venga. Ahora, todos los usuarios que inician sesión también ven el contenido no conectado. ¿Hay alguna forma de separar esta acción sin cambiar la URL?

Respuesta

1

cache_if y cache_unless parece ser la forma correcta de hacer esto ahora:

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

Su código:

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

6

Lo que desea no se puede lograr;

Una página está almacenada en caché o no está en caché. El proceso verifica la existencia de un archivo html o lo procesa.

Todavía tiene dos alternativas:

  • utilizar la caché de acción o almacenamiento en caché de fragmento (no se recomienda)

  • más recomendados: parte específica del usuario carga con el Ajax por lo que sólo tendrá una página siempre almacenan en caché y los datos específicos insertan dinámicamente (como stackoverflow)

Éstos son estado de las explicaciones de la técnica: http://railslab.newrelic.com/scaling-rails

+0

Sólo humanamente con los usuarios que no confían en JavaScript ;-) – Arsen7

+3

Ah! ¿Te refieres a los usuarios del siglo XIX? Bueno, tienes razón esta categoría es un dolor. – apneadiving

+0

sí, js puede ser la solución. Pero esperaré otras respuestas por un tiempo :) – dfens

3

La respuesta aceptada ahora está fuera de fecha, como el almacenamiento en caché condicional ya está disponible en los carriles 4. Un pull request fue merged into 4.0.0rc1 que permite :if:unless y parámetros que se pasarán al cache. Esto permite que las plantillas sean SECAS, ya que ya no es necesario duplicar el bloque condicionalmente en caché.

Uso:

<% 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

Esto no funciona para mí con '<% cache [@questions, @votes],: if = > 1 == 0 do%> 'en rieles 4.2 – Abram

Cuestiones relacionadas