Warum funktionieren die Instanzvariablen meines Controllers nicht in Aussicht (Rails)
-
06-07-2019 - |
Frage
Ich möchte meinem Controller ein paar Instanzvariablen hinzufügen, da die fraglichen Variablen aus mehr als einer Aktion erforderlich sind. Das folgende Beispiel funktioniert jedoch nicht wie ich erwarten würde.
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
Soweit ich es verstehe, nimmt Rails die Instanzvariablen vom Controller und stellt sie in der Ansicht zur Verfügung. Wenn ich die gleichen Variablen innerhalb der Aktionsmethoden zuweist, funktioniert es einwandfrei - aber ich möchte es nicht zweimal tun. Warum funktioniert mein Weg nicht?
(Hinweis: Dies ist ein bisschen ein Müllbeispiel, aber ich hoffe, es macht Sinn)
Bearbeiten: Ich habe die Antwort auf diese Frage hier gefunden: Wann werden Ruby -Instanzvariablen eingestellt?
Bearbeiten 2: Wann ist die beste Zeit, um Filter wie PROW_FILTER und die initialisierende Methode zu verwenden?
Lösung
Diese Art von Dingen sollte in einem behandelt werden before_filter
. Ein vorfilter, wie der Name impliziert, ist eine Methode, die vor allen Aktionen aufgerufen wird, oder nur die, die Sie deklarieren. Ein Beispiel:
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
Oder Sie können Ihren Vorab -Datei nur an einer Ihrer Aktionen arbeiten lassen
before_filter :set_toppings, :only => [ :show_pizza_topping ]
Hoffe das hilft.
Bearbeiten: Hier finden Sie einige weitere Informationen dazu Filter in ActionController.
Andere Tipps
Das sind keine Instanzvariablen, oder?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
Sie definieren es auf der Klassenebene, nicht auf Instanzebene. Wie "theiv" betont, müssen Sie sie innerhalb einer Instanzmethode zuweisen.