Rails:ENV.fetch() 和 ENV[] 之间的区别
Posted
技术标签:
【中文标题】Rails:ENV.fetch() 和 ENV[] 之间的区别【英文标题】:Rails: difference between ENV.fetch() and ENV[] 【发布时间】:2018-06-07 17:07:54 【问题描述】:这两种语法有什么区别:
ENV.fetch("MY_VAR")
ENV['MY_VAR']
我已经看到 Rails 5 在不同的地方使用这两个版本,但不知道有什么区别(除了第一个需要输入更多字符)。
【问题讨论】:
@JörgWMittag 其他人都很清楚他们在问什么,并不是每个人在提问时都会查阅字典。如果您需要展示您对英语的掌握程度,欢迎您提供自己的答案。 【参考方案1】:ENV
类哈希对象是普通的 Ruby,不是 Rails 的一部分。来自fine ENV#[]
manual:
检索环境变量
name
的值作为字符串。如果命名变量不存在,则返回nil
。
还有fine ENV#fetch
manual:
检索环境变量
name
。如果给定的名称不存在,并且
default
和块 a 均不存在,则会引发 IndexError。如果给定了一个块,则使用缺少的名称调用它以提供一个值。如果给出了默认值,则在没有给出块时将返回。
所以就像Hash#[]
和Hash#fetch
一样,唯一的区别是fetch
允许您指定未找到键时的行为(使用传递给fetch
的默认值,传递给@ 的默认块987654336@,或引发异常)而[]
只是在找不到密钥时默默地给你nil
。
具体情况如下:
ENV.fetch("MY_VAR")
ENV['MY_VAR']
不同之处在于,如果没有 MY_VAR
环境变量,ENV['MY_VAR']
会给你nil
,但ENV.fetch('MY_VAR')
会引发异常。
【讨论】:
这是使用默认值的方式:ENV.fetch('NON_EXISTENT') 'returns this string'
或ENV.fetch('NON_EXISTENT', 'my default value')
@estani
@YannickSchuchmann 确实!我的例子应该是ENV.fetch('NON_EXISTENT') <compute the value>
或更适合块的东西。否则,您评论中的第二个参数要好得多。以上是关于Rails:ENV.fetch() 和 ENV[] 之间的区别的主要内容,如果未能解决你的问题,请参考以下文章
将 Rails + Puma + Postgres 应用程序部署到 Elastic beanstalk 的正确方法?
谁在运行Puma或Passenger时设置RAILS_MAX_THREADS环境变量?
opsworks rails.env 与自定义 json rails_env 不匹配
.env 未使用 rspec 在 Rails 的测试环境中加载