控制器的所有操作的相同实例变量

时间:2012-02-17 15:01:53

标签: ruby-on-rails ruby scope instance-variables

我有一个rails控制器,其中定义了两个操作:indexshow。 我在index动作中定义了一个实例变量。代码如下所示:

def index
  @some_instance_variable = foo
end

def show
  # some code
end

如何访问@some_instance_variable模板中的show.html.erb

2 个答案:

答案 0 :(得分:55)

您可以使用前置过滤器为多个操作定义实例变量,例如:

class FooController < ApplicationController
  before_filter :common_content, :only => [:index, :show]

  def common_content
    @some_instance_variable = :foo
  end
end

现在可以从@some_instance_variableindex操作呈现的所有模板(包括部分模板)访问show

答案 1 :(得分:12)

除非您从show.html.erb操作中呈现index,否则您还需要在show动作中设置@some_instance_variable。调用控制器操作时,它会调用匹配方法 - 因此在使用index操作时,不会调用show方法的内容。

如果您需要在@some_instance_variableindex操作中将show设置为相同的内容,则正确的方法是定义另一个方法,由index调用和show,用于设置实例变量。

def index
  set_up_instance_variable
end

def show
  set_up_instance_variable
end

private

def set_up_instance_variable
  @some_instance_variable = foo
end

如果您有通配符路由(即set_up_instance_variable

,则将match ':controller(/:action(/:id(.:format)))'方法设为私有可防止将其作为控制器操作调用