Почему переменные экземпляра моего контроллера не работают в представлениях (Rails)

StackOverflow https://stackoverflow.com/questions/1412650

Вопрос

Я хотел бы добавить пару переменных экземпляра в мой контроллер, поскольку рассматриваемые переменные требуются из более чем одного вида действия. Однако приведенный ниже пример не работает так, как я ожидал.

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" указывает, что вам нужно назначить их внутри метода экземпляра.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top