升级Rails 5.2.0后,Rails.env无法访问credentials环境配置问题
解决Rails 5.2 Credentials环境键字符串转符号的问题
哈哈,我前不久升级Rails 5.2的时候也踩过这个坑!你猜的完全没错——问题核心就是Rails.env返回的是字符串类型(比如"development"),但你在credentials.yml.enc里定义的环境键是符号类型(:development),直接用字符串去匹配符号键,自然拿不到对应的值,返回nil后调用[]方法就会触发NoMethodError了。
给你几个简单的解决办法,按需选就行:
方法1:手动把环境字符串转成符号
这是最直接快速的方式,每次调用的时候用to_sym转换:
Rails.application.credentials[Rails.env.to_sym][:aws][:access_key_id]
测试一下,不管当前是development还是production环境,都能正确拿到对应的AWS密钥啦。
方法2:让Credentials支持「indifferent access」(一劳永逸版)
如果你不想每次都手动转符号,可以新建一个初始化文件(比如config/initializers/credentials.rb),添加下面的代码:
Rails.application.credentials = Rails.application.credentials.with_indifferent_access
这个方法会让credentials对象同时支持字符串和符号两种键的访问方式,之后不管你写:
Rails.application.credentials[Rails.env][:aws][:access_key_id]
还是:
Rails.application.credentials[:development][:aws][:access_key_id]
都能正常返回结果,彻底解决类型不匹配的问题。
小提示
顺便提一句:在Rails 6及以上版本中,官方已经默认让credentials支持indifferent access了,但5.2版本还没这个特性,所以上面的方法正好适配你的场景。
内容的提问来源于stack exchange,提问作者tomb
相关产品推荐
相关产品推荐

