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