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?

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top