Ruby on rails 模块变量不存在';我不能保持它的状态
我有一个Ruby模块,包含一个方法和一个变量: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中访问它时都会对它进行评估。这
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