Ruby on rails 模块变量不存在';我不能保持它的状态

Ruby on rails 模块变量不存在';我不能保持它的状态,ruby-on-rails,ruby,Ruby On Rails,Ruby,我有一个Ruby模块,包含一个方法和一个变量: module ApplicationHelper @var1 = MyModel::CONST1.each_with_index.map { |item, i| [item, i] } def method1 v1, v2, v3 = @var1[0] #.... # access to @var1 end end 我希望@var1成为一个变量的原因是,如果它是一个方法,那么每次我在方法1中访问它时都会对它进行评估。这

我有一个Ruby模块,包含一个方法和一个变量:

module ApplicationHelper
  @var1 = MyModel::CONST1.each_with_index.map { |item, i| [item, i] }
  def method1 v1, v2, v3 = @var1[0]
    #....
    # access to @var1
  end
end
我希望
@var1
成为一个变量的原因是,如果它是一个方法,那么每次我在
方法1
中访问它时都会对它进行评估。这是不合理的,因此,我希望它只被评估一次

然而,当我通过ajax(使用它的基于ajax的对话框)调用这个
方法1
(它是一个助手方法)时,@var1变成了零。同样,在第一页加载过程中,它会按照我的预期填写


我该怎么办?

您的上下文不一样(请参阅):

这是一个技巧,它利用了这样一个事实:第一次引用变量时,它将是
nil
,而
nil
在Ruby中被认为是时髦的。因此,上面这一行是写作的捷径:

@var1 || @var1 = MyModel::CONST1.each_with_index.map { |item, i| [item, i] }
注意:请注意,如果
@var1
可能是
nil
false
的值,则每次都会对其进行重新评估。然而,在这种情况下。由于您正在使用,如果没有项目,您将获得
[]
,而不是
nil
。因此,在这种情况下,使用情况将与预期一致

第一次调用
method1
时,边缘大小写会出现问题,因为您使用它来设置默认值。如果我们改用消息传递而不是直接变量访问,我们可以实现您想要的:

module ApplicationHelper
  def method1(v1, v2, v3 = var1.first)
    #....
    # all further access to @var1 is done by passing the message var1
    tmp = var1.select{ ... }
  end

  def var1
    @var1 ||= MyModel::CONST1.each_with_index.map { |item, i| [item, i] }
  end
end
@var1 || @var1 = MyModel::CONST1.each_with_index.map { |item, i| [item, i] }
module ApplicationHelper
  def method1(v1, v2, v3 = var1.first)
    #....
    # all further access to @var1 is done by passing the message var1
    tmp = var1.select{ ... }
  end

  def var1
    @var1 ||= MyModel::CONST1.each_with_index.map { |item, i| [item, i] }
  end
end