2009-09-11 3 views
6

Vorrei aggiungere un paio di variabili di istanza al mio controller, poiché le variabili in questione sono richieste all'interno di più di una vista di un'azione. Tuttavia, l'esempio seguente non funziona come mi aspetterei.Perché le variabili di istanza del mio controller non funzionano nelle viste (Rails)

class ExampleController < ApplicationController 
    @var1 = "Cheese" 
    @var2 = "Tomato" 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 
end 

Come ho capito, Rails prende le variabili di istanza dal controller e le rende disponibili nella vista. Se assegno le stesse variabili all'interno dei metodi di azione, funziona bene - ma non voglio farlo due volte. Perché la mia strada non funziona?

(Nota: questo è un po 'di un esempio di spazzatura, ma spero che abbia senso)

EDIT: ho trovato la risposta a questa domanda qui: When do Ruby instance variables get set?

EDIT 2: quando è il momento migliore per utilizzare filtri come before_filter e il metodo di inizializzazione?

risposta

10

Questi tipi di cose devono essere gestiti in un before_filter. Un filtro precedente, come suggerisce il nome, è un metodo che verrà chiamato prima di qualsiasi azione, o solo di quelle dichiarate. Un esempio:

class ExampleController < ApplicationController 

    before_filter :set_toppings 

    def show_pizza_topping 
    # What I want is the above instance vars from within the view here 
    end 

    def show_sandwich_filling 
    # What I want is the above instance vars from within the view here 
    end 

protected 

    def set_toppings 
    @var1 = "Cheese" 
    @var2 = "Tomato" 
    end 

end 

Oppure, si potrebbe avere il before_filter funzionano solo su una delle tue azioni

before_filter :set_toppings, :only => [ :show_pizza_topping ] 

Spero che questo aiuti.

MODIFICA: Ecco ulteriori informazioni su filters in ActionController.

+0

Sì, grazie. Tuttavia, poco dopo aver postato questo ho trovato un'altra risposta (ho aggiornato la domanda per riflettere questo). Quando è il momento migliore per utilizzare before_filter e/o inizializzare? –

+0

Direi che dovresti usare un before_filter se è un lavoro di set-up che deve lavorare su più azioni. – theIV

+0

Come esempio del commento che ho appena lasciato, quando si verifica che qualcuno è loggato, in genere si può avere un metodo in 'ApplicationController' e si applica un' before_filter' a qualsiasi azione che richieda l'accesso dell'utente. Non sarebbe ha senso avere quel codice in ogni azione che richiede l'accesso di qualcuno. – theIV

2

Quelle non sono variabili di istanza, vero?

class A 
    @x = 5 
    def f 
    puts @x 
    end 
end 

A.new.f 
=> nil 

Si sta definendo a livello di classe, non a livello di istanza. Come indica "theIV", è necessario assegnarli all'interno di un metodo di istanza.

+0

Avevo l'impressione sbagliata di poterlo fare in quel modo, come in C# o Java: classe classe ExampleController { stringa privata var1 = "formaggio"; // ... } –

+0

In Java, lì, stai dichiarando una variabile di istanza; in Ruby, le variabili non sono dichiarate, quindi non esiste un vero equivalente. Qualsiasi cosa all'interno della "classe" Ruby ... "fine" viene fondamentalmente valutata, quindi potrebbe essere utile considerarla equivalente a un inizializzatore statico Java. – Ken