Ruby on rails 为什么我的控制器';s实例变量在视图(Rails)中不起作用

Ruby on rails 为什么我的控制器';s实例变量在视图(Rails)中不起作用,ruby-on-rails,ruby,scope,instance-variables,Ruby On Rails,Ruby,Scope,Instance Variables,我想向我的控制器添加几个实例变量,因为所讨论的变量是来自多个操作视图的必需变量。然而,下面的例子并不像我预期的那样有效 class ExampleController < ApplicationController @var1 = "Cheese" @var2 = "Tomato" def show_pizza_topping # What I want is the above instance vars from within the view here en

我想向我的控制器添加几个实例变量,因为所讨论的变量是来自多个操作视图的必需变量。然而,下面的例子并不像我预期的那样有效

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
class ExampleController
据我所知,Rails从控制器获取实例变量,并使它们在视图中可用。如果我在action方法中分配相同的变量,那么效果很好——但我不想重复两次。为什么我的方式行不通

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

编辑:我在这里找到了这个问题的答案:


编辑2:什么时候是使用过滤器的最佳时间,例如在过滤器之前和初始化方法?

这些类型的事情应该在过滤器之前的
中处理。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
希望这有帮助


编辑:这里有一些关于的详细信息。

这些不是实例变量,是吗

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

A.new.f
=> nil

您是在类级别定义它,而不是在实例级别。正如“theIV”所指出的,您需要在实例方法中分配它们。

是的,谢谢。然而,在发布这篇文章后不久,我找到了另一个答案(我更新了问题以反映这一点)。什么时候是使用before_筛选器和/或初始化的最佳时间?我想说的是,如果任何类型的设置工作都需要处理多个操作,那么您应该使用before_筛选器。作为我刚才留下的评论的一个示例,当验证有人登录时,通常,您可以在
ApplicationController
中使用一个方法,并对任何需要用户登录的操作应用
前过滤器。在每个需要有人登录的操作中都使用该代码是没有意义的。请理解-这将使您更容易在必要时拆分为多个筛选方法,和/或在必要时分配给特定操作。谢谢-当你来自类似C的语言时,这有点像Ruby。为了更好的组织和可读性,最好使用before#filter。我有一个错误的印象,你可以这样做,就像在C#或Java语言中一样:Java中的class ExampleController{private string var1=“cheese”/…},您正在声明一个实例变量;在Ruby中,没有声明变量,因此没有真正的等价物。Ruby“class.”“end”中的任何内容基本上都是经过计算的,因此将其视为等同于Java静态初始值设定项可能会有所帮助。
class A
  @x = 5
  def f
    puts @x
  end
end

A.new.f
=> nil