2009-12-03 13 views
7

Sono abbastanza nuovo per i binari quindi mi scuso se sto usando la terminologia sbagliata.Variabili di istanza nel layout

Ho un modello Menuitem che mi piacerebbe visualizzare il contenuto di un layout. Come si fa a passare una variabile di istanza in un layout?

Stavo cercando un assistente di layout di qualche tipo ma non sono stato in grado di trovare nulla. Stavo anche cercando di definire la variabile di istanza nel controller dell'applicazione per accedervi nel layout, funzionerebbe? Se sì, qual è il modo migliore per farlo?

Grazie!

+0

dispiace vorrei chiarire. Non intendo in una vista, voglio dire visualizzarli in un layout. – puttputt

risposta

3

Due cose che vorrei notare. Innanzitutto, probabilmente non vuoi eseguire questa query ogni volta che esegui il rendering di qualsiasi pagina nella tua applicazione. Sicuramente vuoi mettere in cache i tuoi MenuItem. In secondo luogo, potrebbe essere utile inserire un metodo di convenienza nella classe MenuItems per memorizzare questo valore nella cache. Quindi, se io definisco un metodo

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

posso chiamare MenuItem.all_for_menu nel mio layout e ottenere tutte le voci di menu. Se mai ne aggiungi uno nuovo o ne modifichi uno, dovresti invalidarlo.

Un altro approccio caching sarebbe quello di mettere i dati in un parziale e memorizzare nella cache quel frammento utilizzando la chiamata standard con cache:

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

È quindi possibile scadere quel frammento chiamando:

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

Eventuali variabili di istanza definite nei controller sono automaticamente disponibili nelle visualizzazioni. Se si prevede una variabile di istanza nel proprio layout per tutte le azioni, è consigliabile prendere in considerazione la definizione della variabile di istanza in un before_filter o incapsularla in un metodo controller e utilizzare helper_method per renderlo accessibile nelle proprie visualizzazioni.

+0

Potresti approfondire il concetto di before_filter? Ho pensato di utilizzare helper_method, ma penso che mi consenta solo di usarlo in Views e non nel layout in cui ne ho bisogno. – puttputt

+0

helper_method consente di utilizzare il metodo nell'intero livello di visualizzazione, inclusi layout, viste e helper – Lytol

-1

Dipende davvero da cosa si vuole fare con lo model. Mi limiterò a indovinare e tu mi dirai cosa ti serve di diverso per capire meglio come farlo. Questo codice funzionerebbe solo se il tuo modello MenuItem ha un campo denominato name.

Nel controllore:

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

Nel file index.html.erb vista:

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

Ovviamente se questo è stato un vero e proprio menù, ci sarebbero collegamenti ipertestuali anche lì :)

-2

items_controller.rb (o qualcosa del genere)

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

Nella vista show.html.erb:

<%= @menu_item.name %> 
14

Il Il modo usuale di passare le variabili dalla vista al layout principale è utilizzare il metodo content_for.(Questa risposta è una copia + incolla da una risposta simile che ho postato a this question)

Il normale contenuto della vista viene automaticamente reso nella chiamata yield senza un argomento nel layout. Ma puoi anche inserire altri contenuti segnaposto utilizzando yield con un argomento simbolo e specificando quel contenuto dalla 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> 
Problemi correlati