我正在编写一个 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
返回零。然后我们得到那个著名的 rails 错误undefined method for nil:NilClass
我的 gem 的 settings.yml 文件格式正确,所以没有理由说这种语法不起作用,因为我几乎在每个项目中都使用 gem,所以我很清楚它的功能以及如何使用它。
database:
adapter: 'postgresql'
这只会让我相信,由于某种原因,设置 gem 没有按应有的方式加载 .yml 文件。可能加载路径搞砸了,或者当引擎捆绑到应用程序中时配置 gem 在错误的时间加载。
任何有任何关于如何让这个宝石在引擎中正常工作的信息的人都将不胜感激。
这是完整堆栈跟踪的要点