2009-09-11 19 views
6

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 era de esperar.Por qué las variables de instancia de mi controlador no funcionan en vistas (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 

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: esto es un poco de un ejemplo basura, pero espero que tenga sentido)

EDIT: He encontrado la respuesta a esta pregunta aquí: When do Ruby instance variables get set?

EDIT 2: cuando Cuál es el mejor momento para usar filtros como before_filter y el método de inicialización?

Respuesta

10

Este tipo de cosas se deben manejar en un before_filter. Un filtro de 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, podría tener su before_filter sólo funcionan 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 filters in ActionController.

+0

Sí, gracias. Sin embargo, poco después de publicar esto encontré otra respuesta (actualicé la pregunta para reflejar esto). ¿Cuándo es el mejor momento para usar before_filter y/o initialize? –

+0

Diría que debería usar un before_filter si es algún tipo de trabajo de configuración que tiene que funcionar en múltiples acciones. – theIV

+0

Como un ejemplo del comentario que acabo de dejar, al verificar que alguien está conectado, normalmente puede tener un método en 'ApplicationController' y aplicar un' before_filter' a cualquier acción que requiera que el usuario esté conectado. No lo haría tiene sentido tener ese código en cada acción que requiere que alguien inicie sesión. – theIV

2

Esas no son variables de instancia, ¿verdad?

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

A.new.f 
=> nil 

Lo está definiendo en el nivel de clase, no en el nivel de instancia. Como señala "theIV", debe asignarlos dentro de un método de instancia.

+0

Tenía la impresión errónea de que podía hacerlo de esa manera, como en lenguajes como C# o Java: clase ExampleController { cadena privada var1 = "cheese"; // ... } –

+0

En Java, está declarando una variable de instancia; en Ruby, las variables no se declaran, por lo que no hay un equivalente real. Cualquier cosa dentro de la "clase" de Ruby .. "end" se evalúa básicamente, por lo que podría ayudar pensar que es equivalente a un inicializador estático de Java. – Ken

Cuestiones relacionadas