我一直无法通过中间人扩展的各个部分访问数据。为了解释,这是一个简单的示例扩展,它只是设置变量:
class NextPrevious < Middleman::Extension
option :var1, true, 'A example variable.'
def initialize(app, options_hash={}, &block)
super
app.set :var2, true
@var3 = true
# test all variables
puts defined?(options.var1) ? options.var1 : false #=> true
puts defined?(var2) ? var2 : false #=> true
puts defined?(@var3) ? @var3 : false #=> true
end
def manipulate_resource_list(resources)
# test all variables
puts defined?(options.var1) ? options.var1 : false #=> true
puts defined?(var2) ? var2 : false #=> false
puts defined?(@var3) ? @var3 : false #=> true
end
helpers do
def test_helper
# test all variables
puts defined?(options.var1) ? options.var1 : false #=> false
puts defined?(var2) ? var2 : false #=> true
puts defined?(@var3) ? @var3 : false #=> false
end
end
end
因此,给定三个变量,一个选项,一个全局设置和一个实例变量,所有三种方法都不能访问它们。 我需要所有三种方法,因为我想收集一些数据(来自.yml),通过站点地图(使用manipulate_resource_list
)操纵它并在帮助器中使用它。我不知道如何找到它们的范围结束的位置,或者如何正确地传递它们,因为我不太熟悉在加载过程中调用每个方法或它们彼此之间的关系。有什么建议吗?
答案 0 :(得分:5)
我不想使用@@var
或$var
。扩展选项是实现此目的的预期方式,但正如您所发现的,全局帮助程序位于全局Middleman应用程序的上下文中,而不是扩展的上下文。
执行此操作的一种好方法是将扩展程序从全局扩展注册表中删除。因此,假设您的扩展程序名为:next_previous
:
helpers do
def test_helper
opts = extensions[:next_previous].options
puts opts.defines_setting?(:var1) ? opts.var1 : false
end
end
请注意,options
属性实际上是ConfigurationManager
的一个实例,因此可以使用defines_setting?
等方法来检查设置,而不是defined?
。
答案 1 :(得分:0)
我最终测试了更多变量类型,并通过使用类变量@@var
或全局ruby变量$var
来了解数据是否可以全面访问。
我怀疑如果没有必要,应该避免这些,所以如果有人知道更好的方法,请告诉我。