gpt4 book ai didi

ruby-on-rails - Generator Ruby Gem 中没有用于配置的方法 'configuration'

转载 作者:太空宇宙 更新时间:2023-11-03 16:44:04 25 4
gpt4 key购买 nike

我对这个感到困惑。我最近写了一个 gem,它为 Rails 项目添加了一个生成器。我正在尝试向 gem 添加配置以设置生成器的默认值。但是,当我尝试从生成器引用模块的配置方法时,出现了 no method 'configuration' 错误。

相关代码如下:

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

componentize/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

componentize/component_generator.rb

require 'rails/generators/named_base'

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

就其值(value)而言,如果我在我的测试中 puts Componentize.configuration.extension,它会 puts 'erb' 就像它应该的那样,所以我知道配置方法在某处可用。

spec/lib/generators/componentize/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' 错误吗?

编辑 1

让我们来解决一下这个问题。继续写完所有将使用该配置的代码,当我运行测试时一切都通过了。因此,当测试运行时,Componentize.configuration.extensionConfiguration 类中的任何其他 attr_accessors 都可以正常工作。我遇到的失败是当我尝试在 Rails 项目中运行 gem 的生成器时,当我删除配置时,生成器运行,当我有配置时,它给出了无方法错误。

最佳答案

好吧,首先,我觉得这有点超出我的知识范围,但我只是大胆地猜测一下。

  class << self
attr_accessor :configuration
end

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

也许问题与这两个 block 都将在同一 namespace 下创建配置方法有关?

此外,我正在尝试在这里运行纯 ruby​​ 进行测试,并进行了一些小的更改,但没有出现任何错误:

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

关于ruby-on-rails - Generator Ruby Gem 中没有用于配置的方法 'configuration',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38174543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com