2013-11-21 2 views
3

У меня возникли проблемы с доступом к данным последовательно через различные части промежуточного расширения. Для того, чтобы объяснить, вот упрощенный пример расширение, которое просто устанавливает переменные:Как получить доступ к переменной через расширение 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) и использовать ее в помощнике. Я не знаю, как найти, где заканчивается их область действия, или как правильно их передать, так как я не совсем понимаю, где каждый метод вызывается в процессе загрузки или их взаимосвязи друг с другом. Какие-либо предложения?

ответ

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?.

0

Я закончил тестирование более переменных типов и узнал, что данные были доступны по всей доске, используя либо переменную класса @@var, либо глобальную рубиновую переменную $var.

Я подозреваю, что их следует избегать, если они не нужны, поэтому, если кто-нибудь знает, как лучше это сделать, сообщите мне.