Question

I've been having trouble accessing data consistently through the various parts of a middleman extension. To explain, here's a simplified example extension that just sets variables:

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

So given three variables, a option, a global setting, and an instance variable, none can be accessed across all three methods. I need all three methods because I want to collect some data (from a .yml), manipulate it via the sitemap (using manipulate_resource_list) and use it in a helper. I don't know how to find where their scope ends, or how to pass them properly, since I don't quite grok where each method is called in the loading process or their relationship to each other. Any suggestions?

Was it helpful?

Solution

I'd prefer not to use @@var or $var. Extension options are the intended way to do this, but as you've discovered, global helpers are in the global Middleman application's context, not the extension's context.

A good way to do this is to fish the extension out of the global extension registry. So assuming your extension is named :next_previous:

helpers do
  def test_helper
    opts = extensions[:next_previous].options
    puts opts.defines_setting?(:var1) ? opts.var1 : false
  end
end

Note that the options attribute is actually an instance of ConfigurationManager, so it's possible to use methods like defines_setting? to check a setting rather than defined?.

OTHER TIPS

I ended up testing more variable types and learning that the data was accessible across the board by using either a Class variable @@var or global ruby variable $var.

I suspect that these should be avoided if unnecessary, so if anybody knows a better way to go about it, please let me know.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top