2016-07-03 1 views
2

Я сбитый с толку. Недавно я написал драгоценный камень, который добавляет генератор к проектам Rails. Я пытаюсь добавить конфигурацию в драгоценный камень, чтобы установить значения по умолчанию для генератора. Однако, когда я пытаюсь ссылаться на метод настройки модуля из генератора, я получаю ошибку no method 'configuration'.Никакой метод 'Конфигурация' для конфигурации в генераторе Ruby Gem

Вот соответствующий код:

componentize.rb

require 'rails' 
require "componentize/engine" 
require "componentize/version" 
require "componentize/configuration" 

module Componentize 
    class << self 
    attr_accessor :configuration 
    end 

    def self.configuration 
    @configuration ||= Configuration.new 
    end 

    def self.configure 
    yield(configuration) 
    end 

    def self.reset 
    @configuration = Configuration.new 
    end 
end 

компонентизацию/configuration.rb

module Componentize 
    class Configuration 
    attr_accessor :extension, :view_partial_dir, :inline_style_partial_dir, :block_style_partial_dir, :import_file 

    def initialize 
     @extension = 'erb' 
     @view_partial_dir = 'application' 
     @inline_style_partial_dir = 'blocks' 
     @block_style_partial_dir = 'sections' 
     @import_file = 'base.scss' 
    end 
    end 
end 

компонентизацию/component_generator.rb

require 'rails/generators/named_base' 

module Componentize 
    class ComponentGenerator < Rails::Generators::NamedBase 
    # Componentize.configuration will error here. 
    end 
end 

И для чего это стоит, если я puts Componentize.configuration.extension внутри моего теста, puts 'erb' так же, как и должно быть, так что я знаю, что метод конфигурации доступен где-то.

спецификации/Lib/генераторы/компонентизацию/component_spec.rb

require 'fileutils' 
require 'spec_helper' 
require 'generator_spec' 
require 'generators/componentize/component_generator' 

describe Componentize::ComponentGenerator, type: :generator do 
    destination File.expand_path('../tmp', __FILE__) 
    arguments %w(test-component) 

    before :all do 
    prepare_destination 
    create_tmp_dirs_and_files 
    show_me_componentize 
    run_generator 
    end 

    it "creates a view file" do 
    assert_file "app/views/application/_test_component.html.erb" 
    end 

    it "creates an scss file" do 
    assert_file "app/assets/stylesheets/blocks/_test_component.scss" 
    end 

    it "finds a base.scss file" do 
    assert_file "app/assets/stylesheets/base.scss" 
    end 

    private 

    def create_tmp_dirs_and_files 
    FileUtils.mkdir_p('spec/lib/generators/tmp/app/assets/stylesheets') 
    FileUtils.touch('spec/lib/generators/tmp/app/assets/stylesheets/base.scss') 
    end 

    def show_me_componentize 
    puts Componentize.configuration.extension # works just fine 
    end 
end 

Любой понять, почему я получаю ошибку no method 'configuration'?

EDIT 1

Бросим ключ в этом. Пошел вперед и закончил писать весь код, который будет использовать конфигурацию, и все это проходит, когда я запускаю тесты. Таким образом, Componentize.configuration.extension и любой другой attr_accessors в классе Configuration работают правильно, когда испытания выполняются. Ошибка, которую я получаю, заключается в попытке запустить генератор драгоценных камней в проекте Rails, когда я удаляю конфигурацию, генератор работает, когда у меня есть конфигурация, она дает ошибку метода.

ответ

0

Хорошо, во-первых, я чувствую, что это немного не в моих силах, но я просто брошу дикую догадку.

class << self 
    attr_accessor :configuration 
    end 

    def self.configuration 
    @configuration ||= Configuration.new 
    end 

Возможно, проблема связана с тем, что оба этих блока будут создавать метод конфигурации в одном и том же пространстве имен?

Кроме того, я пытаюсь проверить здесь работает чистый рубин, с некоторыми незначительными изменениями, и я не получаю ошибки:

module Componentize 
    class << self 
    attr_accessor :configuration 
    end 

    def self.configuration 
    @configuration ||= Configuration.new 
    end 

    def self.configure 
    yield(configuration) 
    end 

    def self.reset 
    @configuration = Configuration.new 
    end 

    class Configuration 
    attr_accessor :extension 

    def initialize 
     @extension = 'erb' 
    end 
    end 

    class ComponentGenerator # < Rails::Generators::NamedBase 
    @default_extension = Componentize.configuration.extension # failure here 
    # More code 
    end 

    ComponentGenerator.new 
end 
+0

Для записи, ваша первая догадка вряд ли будет проблемой, у меня есть использовали и видели этот шаблон раньше. Вот пример: https://robots.thoughtbot.com/mygem-configure-block У меня есть эти классы в отдельных файлах, поэтому я буду обновлять свой пример, чтобы отразить это в случае, если мне не хватает include/require some where. –

Смежные вопросы