Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在Rails中最好地处理基于环境的配置_Ruby On Rails_Ruby_Oop - Fatal编程技术网

Ruby on rails 如何在Rails中最好地处理基于环境的配置

Ruby on rails 如何在Rails中最好地处理基于环境的配置,ruby-on-rails,ruby,oop,Ruby On Rails,Ruby,Oop,我想知道下面的方法在多个环境中捕获自定义配置参数有多糟糕。这是为了解决可能需要组织好几层的非常大的配置参数的情况 需要以下功能: -设置配置参数需要非常简单,易于复制/粘贴 -访问配置参数需要简洁 -应为灵活性编程,无yaml(除非确信) -每个环境的配置不必是强制性的,应该依赖于正常的默认值(在本例中为:基本配置) -初始化配置对象需要简洁 -需要隐藏环境详细信息 此实现的缺点: -eval是邪恶的?在这种情况下eval真的那么糟糕吗?用户不控制这些值,它们都在源代码中硬编码。 -不是最快的,

我想知道下面的方法在多个环境中捕获自定义配置参数有多糟糕。这是为了解决可能需要组织好几层的非常大的配置参数的情况

需要以下功能: -设置配置参数需要非常简单,易于复制/粘贴 -访问配置参数需要简洁 -应为灵活性编程,无yaml(除非确信) -每个环境的配置不必是强制性的,应该依赖于正常的默认值(在本例中为:基本配置) -初始化配置对象需要简洁 -需要隐藏环境详细信息

此实现的缺点: -eval是邪恶的?在这种情况下eval真的那么糟糕吗?用户不控制这些值,它们都在源代码中硬编码。 -不是最快的,但对我来说没关系 -初始化散列很奇怪 -“get”电话也有点奇怪

这是因为我需要有一种健壮的方法来处理可能包含大量参数的文件。这些参数可能因环境而异,因此能够轻松覆盖基本值(每个环境)至关重要

这些参数还需要与调用它们的模型紧密耦合,因此不能选择初始值设定项和全局值

如果有人有更好的方法以更优雅的方式实现这些目标,我很乐意听到。这段代码不是很好的idomatic设计,所以我希望得到一些其他的想法,比如一个强大的oop方法

class Paramz
  def initialize(params)
    @env = :development # Rails.env.to_sym
    @params = params
  end

  def get(values)
    eval_hash(values.split("."))
  end

  protected

  def eval_hash(values)
    new_val = String.new

    values.map { |v| new_val = new_val + "[:#{v}]" }
    base, env = eval("@params[:base]" + new_val), eval("@params[@env]" + new_val)

    return env != {} ? env : base
  end
end

p = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }

# file config
p[:base][:file][:path] = "/opt/files"
p[:qa][:file][:path] = "c:\\files\\"
p[:production][:file][:path] = "/opt/projects/final"

params = Paramz.new(p)

# env = :base
puts params.get("file.path")
# >> "/opt/files" # returns :base config

# env = :development
# puts params.get("file.path")
# >> "/opt/files" # no :development config, falls back on :base

# env = :production
# puts params.get("file.path")
# >> "/opt/projects/final" # return :production config

我非常喜欢将环境变量用于根据您的环境更改的配置,或者用于敏感值。退房谢谢,我会仔细看看dotenv。不确定它是否能满足我的所有需求,但我一定会找到答案。