Ruby on rails 如何在Rails中最好地处理基于环境的配置
我想知道下面的方法在多个环境中捕获自定义配置参数有多糟糕。这是为了解决可能需要组织好几层的非常大的配置参数的情况 需要以下功能: -设置配置参数需要非常简单,易于复制/粘贴 -访问配置参数需要简洁 -应为灵活性编程,无yaml(除非确信) -每个环境的配置不必是强制性的,应该依赖于正常的默认值(在本例中为:基本配置) -初始化配置对象需要简洁 -需要隐藏环境详细信息 此实现的缺点: -eval是邪恶的?在这种情况下eval真的那么糟糕吗?用户不控制这些值,它们都在源代码中硬编码。 -不是最快的,但对我来说没关系 -初始化散列很奇怪 -“get”电话也有点奇怪 这是因为我需要有一种健壮的方法来处理可能包含大量参数的文件。这些参数可能因环境而异,因此能够轻松覆盖基本值(每个环境)至关重要 这些参数还需要与调用它们的模型紧密耦合,因此不能选择初始值设定项和全局值 如果有人有更好的方法以更优雅的方式实现这些目标,我很乐意听到。这段代码不是很好的idomatic设计,所以我希望得到一些其他的想法,比如一个强大的oop方法Ruby on rails 如何在Rails中最好地处理基于环境的配置,ruby-on-rails,ruby,oop,Ruby On Rails,Ruby,Oop,我想知道下面的方法在多个环境中捕获自定义配置参数有多糟糕。这是为了解决可能需要组织好几层的非常大的配置参数的情况 需要以下功能: -设置配置参数需要非常简单,易于复制/粘贴 -访问配置参数需要简洁 -应为灵活性编程,无yaml(除非确信) -每个环境的配置不必是强制性的,应该依赖于正常的默认值(在本例中为:基本配置) -初始化配置对象需要简洁 -需要隐藏环境详细信息 此实现的缺点: -eval是邪恶的?在这种情况下eval真的那么糟糕吗?用户不控制这些值,它们都在源代码中硬编码。 -不是最快的,
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。不确定它是否能满足我的所有需求,但我一定会找到答案。