如何在Middleman Extension中访问变量?

时间:2013-11-21 03:34:47

标签: ruby middleman

我一直无法通过中间人扩展的各个部分访问数据。为了解释,这是一个简单的示例扩展,它只是设置变量:

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)操纵它并在帮助器中使用它。我不知道如何找到它们的范围结束的位置,或者如何正确地传递它们,因为我不太熟悉在加载过程中调用每个方法或它们彼此之间的关系。有什么建议吗?

2 个答案:

答案 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来了解数据是否可以全面访问。

我怀疑如果没有必要,应该避免这些,所以如果有人知道更好的方法,请告诉我。