¿Por qué las variables de instancia de mi controlador no funcionan en las vistas (Rails)
-
06-07-2019 - |
Pregunta
Me gustaría agregar un par de variables de instancia a mi controlador, ya que las variables en cuestión son necesarias desde más de una vista de acción. Sin embargo, el siguiente ejemplo no funciona como cabría esperar.
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
Según tengo entendido, Rails toma las variables de instancia del controlador y las pone a disposición en la vista. Si asigno las mismas variables dentro de los métodos de acción, funciona bien, pero no quiero hacerlo dos veces. ¿Por qué mi camino no funciona?
(Nota: este es un ejemplo de basura, pero espero que tenga sentido)
EDITAR: He encontrado la respuesta a esta pregunta aquí: ¿Cuándo hago Ruby? ¿se configuran las variables de instancia?
EDIT 2: ¿cuándo es el mejor momento para usar filtros como before_filter y el método initialize?
Solución
Este tipo de cosas se deben manejar en un before_filter
. Un filtro antes, como su nombre lo indica, es un método que se llamará antes de cualquier acción, o solo las que usted declare. Un ejemplo:
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
O bien, puede hacer que su before_filter solo funcione en una de sus acciones
before_filter :set_toppings, :only => [ :show_pizza_topping ]
Espero que esto ayude.
EDITAR: Aquí hay más información sobre filtros en ActionController .
Otros consejos
Esas no son variables de instancia, ¿verdad?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
Lo estás definiendo a nivel de clase, no a nivel de instancia. Como '' theIV '' señala, debe asignarlos dentro de un método de instancia.