我正在编写一个Rails 5.2可安装引擎,用于将Rails应用程序配置为面向服务的体系结构的一部分。
我一直在尝试在引擎内部使用Config Gem,但不断出现以下错误
install_generator.rb:28:in 'create_database_yml': undefined method 'adapter' for nil:NilClass (NoMethodError)
这是因为我正在尝试构建一个生成器,该生成器基于通过Config gem插入到要复制到文件中的字符串的值来制作正确配置的database.yml文件。导致错误的方法在下面,并且完整的生成器模块代码也在下面的要点。
def create_database_yml
database_name = Rails.application.class.parent_name.underscore.gsub("_","-")
create_file('config/database.yml',
%{default: &default
adapter: 'Settings.database.adapter'
encoding: unicode
pool: <%= ENV['RAILS_MAX_THREADS'] || 5 %>
prepared_statements: false
development:
<<: *default
database: #{database_name}_dev
production:
<<: *default
}
)
end
我已将gem捆绑到rails项目中,当运行生成器时,这是我收到上面提到的错误的时间。
您可以在下面看到完整的堆栈跟踪。
打开Rails控制台并调用Settings
对象
...(这是Config
对象的别名,该对象是gem的核心。)
我在控制台中返回了一个有效的Settings
对象。这让我知道Settings
对象在运行我的引擎的rails应用程序中可用。
但是该错误使我相信对Settings
的调用返回了一个有效的对象……然后对.database
的调用返回了nil。然后我们得到那个著名的Rails错误undefined method for nil:NilClass
我用于gem的settings.yml文件的格式正确,因此当我在几乎每个项目中都使用gem时,没有理由该语法不起作用,因此Im非常了解其功能以及使用方法。
database:
adapter: 'postgresql'
这仅使我相信,由于某种原因,设置gem并未按原样加载.yml文件。可能是加载路径混乱了,或者当引擎绑定到应用程序中时,配置gem在错误的时间加载。
任何人如对如何使该宝石在发动机中正常工作有任何信息,将不胜感激。
这是完整堆栈跟踪的要旨