Perché le variabili di istanza del mio controller non funzionano nelle viste (Rotaie)
-
06-07-2019 - |
Domanda
Vorrei aggiungere un paio di variabili di istanza al mio controller, poiché le variabili in questione sono richieste da più di una vista di azione. Tuttavia, l'esempio seguente non funziona come mi aspetterei.
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
A quanto 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 'un esempio di spazzatura, ma spero abbia senso)
EDIT: ho trovato la risposta a questa domanda qui: When do Ruby le variabili di istanza vengono impostate?
MODIFICA 2: qual è il momento migliore per utilizzare i filtri come before_filter e il metodo di inizializzazione?
Soluzione
Questi tipi di cose dovrebbero essere gestiti in un before_filter
. Un filtro prima, come suggerisce il nome, è un metodo che verrà chiamato prima di qualsiasi azione, o solo 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, potresti avere il tuo before_filter funzionare solo su una delle tue azioni
before_filter :set_toppings, :only => [ :show_pizza_topping ]
Spero che questo aiuti.
EDIT: ecco alcune ulteriori informazioni sui filtri in ActionController .
Altri suggerimenti
Quelle non sono variabili di istanza, vero?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
Lo stai definendo a livello di classe, non a livello di istanza. Come "theIV" sottolinea, è necessario assegnarli all'interno di un metodo di istanza.