2009-12-03 23 views
7

Soy bastante nuevo en los rieles, así que me disculpo si uso una terminología incorrecta.Variables de instancia en el diseño

Tengo un modelo de menú en el que me gustaría mostrar el contenido de un diseño. ¿Cómo se puede pasar una variable de instancia a un diseño?

Estaba buscando un ayudante de diseño de algún tipo, pero no pude encontrar nada. También estaba buscando definir la variable de instancia en el controlador de la aplicación para acceder a ella en el diseño, ¿funcionaría esto? Si es así, ¿cuál es la mejor manera de hacerlo?

Gracias!

+0

sentimos que debería aclarar. No me refiero a una Vista, me refiero a mostrarlos en un diseño. – puttputt

Respuesta

3

Dos cosas que me gustaría tener en cuenta. En primer lugar, es probable que no desee realizar esta consulta cada vez que represente una página en su aplicación. Definitivamente desea almacenar en caché sus elementos de menú. En segundo lugar, podría ser útil poner un método de conveniencia en la clase MenuItems para almacenar este valor en caché. Por lo tanto, si se define un método

def MenuItem.all_for_menu 
    @@all_for_menu ||= MenuItem.find(:all) #returns value if exists, or initializes it 
end 

puedo llamar MenuItem.all_for_menu en mi diseño y obtener todos los elementos de menú. Cada vez que agregue uno nuevo o edite uno, tendrá que invalidarlo.

Otro método de almacenamiento en caché sería poner los datos en un parcial y almacenar en caché ese fragmento usando la llamada de almacenamiento en caché estándar:

<% cache(:controller => "menu_items", 
     :action => "list", 
     :action_suffix => "all_menu_items") do %> 
    <%= render :partial => "menu", :collection => MenuItem.all_for_menu %> 
<% end %> 

A continuación, puede expirar ese fragmento llamando:

expire_fragment(:controller => "menu_items", :action => "list", :action_suffix => "all_menu_items") 
0

Cualquier variable de instancia definida en los controladores está disponible de forma automática en sus vistas. Si espera una variable de instancia en su diseño para todas las acciones, puede considerar definir la variable de instancia en un before_filter o encapsularla en un método de controlador y usar helper_method para hacerla accesible en sus vistas.

+0

¿Podría profundizar en el concepto de before_filter? He reflexionado sobre el uso del helper_method, pero creo que solo me permite usarlo en Views y no en el diseño donde lo necesito. – puttputt

+0

helper_method permite que el método se use en toda la capa de vista, incluidos diseños, vistas y ayudantes – Lytol

-1

Realmente depende de lo que quieras hacer con el model. Voy a adivinar, y me dices lo que necesitas diferente para entender mejor cómo hacer esto. Este código funcionaría solo si su modelo MenuItem tiene un campo llamado name.

En el controlador:

# Use whatever action you are currently displaying 
def index 
    @menu_items = MenuItem.all 
end 

En el archivo index.html.erb vista:

<ul id="menu"> 
<% @menu_items.each do |menu_item| %> 
    <%= h menu_item.name %> 
<% end %> 
</ul> 

Obviamente, si se trataba de un verdadero menú, no habría hipervínculos allí también :)

-2

items_controller.rb (o algo así)

def show 
    @menu_item = MenuItem.find(params[:id]) 
end 

En la vista show.html.erb:

<%= @menu_item.name %> 
14

El La forma habitual de pasar variables desde la vista al diseño principal es usar el método content_for.(Esta respuesta es una copia + pega de una respuesta similar que publiqué en this question)

El contenido de vista normal se procesa automáticamente en la llamada yield sin un argumento en el diseño. Pero también puede incluir otro contenido de marcador de posición usando yield con un argumento de símbolo y especificando ese contenido desde la vista con content_for.

app/views/layouts/posts_layout.html.erb

<html> 
    <head> 
    <title>My awesome site</title> 
    </head> 
    <body> 
    <div id="someMenuStructureHere"> 
     <%= yield(:menu_items) %> <!-- display content passed from view for menu_items --> 
    </div> 
    <%= yield %> <!-- display main view content --> 
    </body> 
</html> 

app/views/posts/index.html.erb

<%= content_for :menu_items, some_helper_to_generate_menu %> 
<h1>Here is you page content</h1> 
Cuestiones relacionadas