ruby-on-rails – 为什么我的控制器的实例变量在视图中不起作用(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

据我了解,Rails从控制器获取实例变量并使其在视图中可用.如果我在动作方法中分配相同的变量,它工作正常 – 但我不想做两次.为什么我的方式不起作用?

(注意:这是一个垃圾的例子,但我希望它有意义)

编辑:我在这里找到了这个问题的答案:When do Ruby instance variables get set?

编辑2:何时是使用诸如before_filter和initialize方法之类的过滤器的最佳时间?

解决方法

应该在before_filter中处理这些类型的事情.前面的过滤器,如名称所示,是一种在任何操作之前调用方法,或者只是您声明的操作.一个例子:
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 ]

希望这可以帮助.

编辑:这里有关于filters in ActionController的更多信息.

相关文章

以下代码导致我的问题: class Foo def initialize(n=0) @n = n end attr_accessor :n d...
这是我的spec文件,当为上下文添加测试“而不是可单独更新用户余额”时,我得到以下错误. require 's...
我有一个拦截器:DevelopmentMailInterceptor和一个启动拦截器的inititializer setup_mail.rb. 但我想将...
例如,如果我有YAML文件 en: questions: new: 'New Question' other: recent: ...
我听说在RSpec中避免它,let,let !,指定,之前和主题是最佳做法. 关于让,让!之前,如果不使用这些,我该如...
我在Rails中使用MongoDB和mongo_mapper gem,项目足够大.有什么办法可以将数据从Mongoid迁移到 Postgres...