我们可以在轨道中覆盖ENV方法吗?

时间:2019-01-24 09:12:54

标签: ruby-on-rails

正常行为

ENV[SOME_ENV_VARIABLE]指向heroku的.env文件或ENVIRONMENT变量

自定义行为

我想如果有人正在调用ENV[SOME_ENV_VARIABLE],我想触发一个带有参数SOME_ENV_VARIABLE的方法。并且该方法应返回某个值(如果该值为nil,则应从.env文件返回该值

`ENV[SOME_ENV_VARIABLE]` # a method call to delegate_env_var(key) where key = SOME_ENV_VARIABLE


 def delegate_env_var(key) # key is `SOME_ENV_VARIABLE`
   value = databasecall(key)
   value.nil? ? ENV[SOME_ENV_VARIABLE] : value
 end

2 个答案:

答案 0 :(得分:0)

ENV不是方法,而是常量:

> defined? ENV
=> "constant"

您可以将其重新分配给所需的任何对象,甚至是字符串(接受警告):

ENV = "asd"
(pry):27: warning: already initialized constant ENV
=> "asd"

因此您可以创建一个对象,该对象将以您描述的方式实现[]方法并将其他对象委托给ENV

这是非常危险的。我宁愿添加一个包装ENV的自定义类,并通过该类访问环境变量:

环境类      def self.get        #从数据库或ENV获取      结束    结束

答案 1 :(得分:0)

您不能覆盖默认行为,这不是一个好习惯。

也许您想执行以下操作

class Object
  def custom_env
    value = databasecall(self)
    value.nil? ? ENV[self] : value
  end
end

并使用SOME_ENV_VARIABLE.custom_env而不是ENV[SOME_ENV_VARIABLE]