gpt4 book ai didi

ruby-on-rails - 了解 Rails 配置

转载 作者:数据小太阳 更新时间:2023-10-29 08:13:39 25 4
gpt4 key购买 nike

所以……首先,我要明确我的目标。我的目标是让一个环境定义的常量充满来 self 的应用程序可以引用的 yaml 文件的属性。

我能给出的最简单的例子是这样的:

#初始值设定项/config.rb

CONFIG = YAML.load_file("#{Rails.root}/config/config.yml")[RAILS_ENV]

#配置文件:

production:
host:
foo.com

development:
host:
localhost
port:
3000

#配置/环境/开发.rb

Foo::Application.configure do
#...
config.action_mailer.default_url_options = { :host => CONFIG[:host], :port => CONFIG[:port] }

config.after_initialize do
Rails.application.routes.default_url_options = { :host => CONFIG[:host], :port => CONFIG[:port] }
end
end

我的问题是:

常量“CONFIG”在 after_initialize block 之前不存在(显然是因为 CONFIG 被设置为初始化过程的一部分),所以我需要将它移到 after_initialize block 中,但我不能引用“config.action_mailer”在 after_initialize block 内,因为该范围内不存在“config”……这让我很困惑。 “config”不应该在 block 内访问,因为它存在于 block 外吗?

作为附带问题,我真的很困惑这个 config.x 业务是如何运作的。该 block 不产生任何变量,那么“config”在 Foo::Application.configure 的上下文中如何有效?

我认为它应该是这样工作的:

Foo::Application.configure do |config|

但事实并非如此,所以我真的很好奇这是如何工作的..

最佳答案

如果您在 config/application.rb 中定义您的配置加载器而不是初始化程序,您应该能够抢先调用 configure 并设置所有内容及时 catch 。

有时最好创建一个处理配置文件的子类。一个非常基本的例子是这样的:

class Foo::Configuration
def initialize
# Read in contents of config file
end

def method_missing(name)
@config[name.to_s]
end
end

然后在您的应用程序中定义如下方法:

class Foo::Application
def self.config
@config ||= Foo::Configuration.new
end
end

这将根据需要自动加载。它还避免了出现在每个对象的上下文中的困惑常量。

关于ruby-on-rails - 了解 Rails 配置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6932346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com