Rails 5.2:能否将方法逻辑存入Credentials配置中?
在Rails 5.2中能否将方法存入Credentials配置?
嘿,咱们直接说结论:你示例里的这种实现方式不可行,原因很简单——Rails Credentials存储的是字符串(或其他基础数据类型),你直接返回这个字符串的话,它不会被当作可执行的方法逻辑来运行。
举个例子,你在Credentials.yml.enc里写score_count: 'score_count...',那么Rails.application.credentials.score_count拿到的就是一个普通字符串"score_count...",你的Post#score_count方法只会返回这个字符串,根本不会执行你期望的计算逻辑。
那该怎么实现类似需求?
如果你的目标是把方法里的可变配置参数存在Credentials里(这才是Credentials的设计初衷),那完全没问题:
# Credentials.yml.enc score_weight: 3 # Post.rb def score_count # 这里是你的核心计算逻辑,用Credentials里的配置参数来动态调整 (likes_count + comments_count) * Rails.application.credentials.score_weight end
如果真的有动态执行代码的需求(非常不推荐!),你可以用eval来执行Credentials里的字符串代码,但必须严肃警告你:
- 这存在极大的安全风险:如果你的Credentials加密文件泄露,攻击者可以注入任意恶意代码到你的应用里执行
- 这种做法完全违背了Credentials用于存储敏感配置的设计目的
示例(仅作演示,禁止在生产环境使用):
# Credentials.yml.enc score_count_logic: "(likes_count * 2) + (comments_count * 1.5)" # Post.rb def score_count eval(Rails.application.credentials.score_count_logic) end
总结
Rails Credentials是用来存储敏感的静态配置项(比如API密钥、数据库密码、第三方服务配置)的,不是用来存储可执行代码的。最好的实践是把方法的核心逻辑留在模型/业务代码里,把需要动态调整的参数存在Credentials中。
内容的提问来源于stack exchange,提问作者Anton Ipatov
相关产品推荐
相关产品推荐

