Почему переменные экземпляра моего контроллера не работают в представлениях (Rails)
-
06-07-2019 - |
Вопрос
Я хотел бы добавить пару переменных экземпляра в мой контроллер, поскольку рассматриваемые переменные требуются из более чем одного вида действия. Однако приведенный ниже пример не работает так, как я ожидал.
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
Насколько я понимаю, Rails берет переменные экземпляра из контроллера и делает их доступными в представлении. Если я присваиваю те же переменные в методах действия, это работает нормально, но я не хочу делать это дважды. Почему мой путь не работает?
(Примечание: это небольшой мусор, но я надеюсь, что это имеет смысл)
РЕДАКТИРОВАТЬ: я нашел ответ на этот вопрос здесь: Когда работает Ruby переменные экземпляра установлены?
РЕДАКТИРОВАТЬ 2: когда лучше всего использовать фильтры, такие как before_filter и метод initialize?
Решение
Эти типы вещей должны обрабатываться в before_filter
. Фильтр before, как следует из названия, - это метод, который будет вызываться перед любыми действиями или только теми, которые вы объявляете. Пример:
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
Или вы можете использовать фильтр before_filter только для одного из ваших действий
before_filter :set_toppings, :only => [ :show_pizza_topping ]
Надеюсь, это поможет.
РЕДАКТИРОВАТЬ: Вот еще немного информации о фильтрах в ActionController .
Другие советы
Это не переменные экземпляра, не так ли?
class A
@x = 5
def f
puts @x
end
end
A.new.f
=> nil
Вы определяете это на уровне класса, а не на уровне экземпляра. Как "TheIV" указывает, что вам нужно назначить их внутри метода экземпляра.