在模块中使用Rails.application访问credentials报错的原因及解决方法咨询
嘿,这个问题我太熟了!咱们先拆解一下为啥会报这个错:
报错原因
你看到的 undefined method 'credentials' for nil:NilClass 本质是 Rails.application 还没被初始化,此时它的值是 nil。
你在模块里只写了 require 'rails',这仅仅是加载了Rails的核心库,但并没有启动整个Rails应用环境——Rails应用实例(也就是 Rails.application)要等到加载完配置文件、初始化各种组件后才会被创建出来,这时候直接调用它的credentials方法自然会报错。
解决方法
根据你的使用场景,有几种靠谱的解决方式:
1. 手动加载完整的Rails环境
如果这个模块是Rails应用的一部分,需要在模块里先加载Rails的环境配置文件,这样就能让Rails.application正常初始化。在你的模块开头加上:
require_relative 'config/environment'
注意路径哦!如果你的Ruby文件在项目根目录,config/environment.rb就在同级目录,这个路径是没问题的;如果文件位置不同,要调整相对路径或者使用绝对路径。
2. 把模块放到Rails的自动加载路径里
Rails会自动加载app目录下的子文件夹(比如app/lib)里的文件,而且是在应用初始化完成之后加载的。你可以把这个模块文件移到app/lib目录下,这样就不用手动加载环境了,直接调用Rails.application.credentials就能正常工作。
3. 检查模块的加载时机
如果你的模块是被其他文件提前require了(比如在Rails初始化之前),那也会导致这个问题。要确保这个模块是在Rails应用完全启动之后才被加载或调用的,比如放在控制器、模型里使用,而不是在启动脚本里提前加载。
举个调整后的示例代码(放在根目录的话):
module MyFile # 先加载Rails环境 require_relative 'config/environment' require 'rails' # 现在就能正常调用了 def self.get_password Rails.application.credentials.dig(:service, :password) end end
备注:内容来源于stack exchange,提问作者sscirrus

