2011-02-12 10 views
10

Estoy trabajando en una aplicación RoR y estoy trabajando en escribir el componente del blog. Estoy planeando tener un archivo de diseño que muestre todas las etiquetas de la base de datos en cada página dentro del componente de blog. Sé cómo crear y usar un archivo de diseño diferente de application.html.erb, pero lo que no sé es cómo leer la lista de etiquetas de la base de datos para cada acción en los distintos controladores. No me gustaría crear la variable de instancia apropiada dentro de cada acción. ¿Cuál es una forma apropiada de abordar esto?Ruby on Rails Layout leyendo datos del modelo

Respuesta

16

Utilice un before_filter en su application_controller para crear la variable de instancia:

before_filter :populate_tags 

protected 

def populate_tags 
    @sidebar_tags = Tag.all 
end 
+0

Esta es exactamente la respuesta que necesitaba. Pensé en usar el before_filter, pero no en el application_controller. ¡Gracias! –

+0

Busque el almacenamiento en caché de fragmentos y 'read_fragment' también. Querrá guardar en caché ese bit de etiquetas y evitar golpear a menos que el fragmento sea obsoleto; de lo contrario, podría agregar una sobrecarga significativa a todo el sitio. –

1

Defina un método privado en ApplicationController y cárguelo allí con un before_filter. Dado que todos los controladores heredan de ApplicationController, se ejecutará antes de cada acción.

Otra idea sería cargarla a través de un método auxiliar, pero preferiría la primera solución.

9

Yo recomiendo usar un before_filter, sino también el almacenamiento en caché el resultado en memcached. Si usted va a ser la realización de esta acción en cada petición que lo mejor es hacer algo como esto:

class ApplicationController 
    before_filter :fetch_tags 

    protected 

    def fetch_tags 
    @tags = Rails.cache.fetch('tags', :expires_in => 10.minutes) do 
     Tag.all 
    end 
    end 
end 

Esto asegurará que las etiquetas se almacenan en caché durante un determinado período de tiempo (por ejemplo 10 minutos), por lo que solo tiene que hacer esta consulta una vez cada 10 minutos, en lugar de hacerlo en cada solicitud.

Puede mostrar sus etiquetas en la barra lateral, por ejemplo, si tiene una barra lateral _side que se muestra en sus diseños, podría hacer lo siguiente.

#_sidebar.html.erb 
render @tags 
Cuestiones relacionadas