为我的Rails应用程序创build自定义configuration选项的最佳方法?

我需要为我的Rails应用程序创build一个configuration选项。 对所有的环境来说都是一样的。 我发现,如果我把它设置在environment.rb ,它是在我的意见,这正是我想要的…

 environment.rb AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda 

很好用。

不过,我有点不安。 这是一个好办法吗? 有没有更好的方法?

对于不需要存储在数据库表中的常规应用程序configuration,我喜欢在config目录中创build一个config.yml文件。 对于你的例子,它可能看起来像这样:

 defaults: &defaults audiocast_uri_format: http://blablalba/blabbitybla/yadda development: <<: *defaults test: <<: *defaults production: <<: *defaults 

这个configuration文件从config / initializers中的自定义初始化程序中加载:

 # Rails 2 APP_CONFIG = YAML.load_file("#{RAILS_ROOT}/config/config.yml")[RAILS_ENV] # Rails 3+ APP_CONFIG = YAML.load_file(Rails.root.join('config/config.yml'))[Rails.env] 

如果您使用的是Rails 3,请确保您不会无意中将一个前导斜杠添加到您的相关configurationpath中。

然后您可以使用以下方法检索值:

 uri_format = APP_CONFIG['audiocast_uri_format'] 

看到这个Railscast的全部细节。

Rails 3的初始化代码版本如下(RAILS_ROOT&RAILS_ENV已弃用)

APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env]

另外,Ruby 1.9.3使用了Psych,它使合并键区分大小写,所以你需要改变你的configuration文件来考虑这个问题

 defaults: &DEFAULTS audiocast_uri_format: http://blablalba/blabbitybla/yadda development: <<: *DEFAULTS test: <<: *DEFAULTS production: <<: *DEFAULTS 

Rails 5,Rails 4.2

只要创build一个YAML文件到config/目录,例如: config/neo4j.yml

neo4j.yml内容可以像下面一样(为了简单起见,我在所有的环境中都使用了default):

 default: &default host: localhost port: 7474 username: neo4j password: root development: <<: *default test: <<: *default production: <<: *default 

config/application.rb

 module MyApp class Application < Rails::Application config.neo4j = config_for(:neo4j) end end 

现在,您的自定义configuration可以像下面一样访问:

 Rails.configuration.neo4j['host'] #=>localhost Rails.configuration.neo4j['port'] #=>7474 

更多信息

Rails的官方API文档将config_for方法描述为:

为当前Rails env加载config / foo.yml的便利。


如果你不想使用yaml文件

正如Rails的官方指南所说:

您可以使用configuration属性下的自定义configuration通过Railsconfiguration对象configuration自己的代码。

 config.x.payment_processing.schedule = :daily config.x.payment_processing.retries = 3 config.x.super_debugger = true 

这些configuration点可通过configuration对象获得:

 Rails.configuration.x.payment_processing.schedule # => :daily Rails.configuration.x.payment_processing.retries # => 3 Rails.configuration.x.super_debugger # => true Rails.configuration.x.super_debugger.not_set # => nil 

官方参考config_for方法 | 官方的Rails指南

第1步:创buildconfig / initializers / appconfig.rb

 require 'ostruct' require 'yaml' all_config = YAML.load_file("#{Rails.root}/config/config.yml") || {} env_config = all_config[Rails.env] || {} AppConfig = OpenStruct.new(env_config) 

第2步:创buildconfig / config.yml

 common: &common facebook: key: 'asdjhasxas' secret : 'xyz' twitter: key: 'asdjhasxas' secret : 'abx' development: <<: *common test: <<: *common production: <<: *common 

第3步:获取代码中的任何地方的常量

 facebook_key = AppConfig.facebook['key'] twitter_key = AppConfig.twitter['key'] 

我只是想在Rails 4.2和5中更新这个最新的酷东西,你现在可以在你的config/**/*.rb文件中做到这一点:

 config.x.whatever = 42 

(那里面是一个字面x ,即config.x.字面上必须是这样的,然后你可以在x之后添加任何你想要的)

…这将在您的应用程序中可用:

 Rails.configuration.x.whatever 

在这里看到更多: http : //guides.rubyonrails.org/configuring.html#custom-configuration

只是一些额外的信息在这个话题上:

 APP_CONFIG = YAML.load_file(Rails.root.join('config', 'config.yml'))[Rails.env].with_indifferent_access 

“.with_indifferent_access”允许您使用string键或等效的符号键访问哈希值。

例如。
APP_CONFIG['audiocast_uri_format'] => 'http://blablalba/blabbitybla/yadda' APP_CONFIG[:audiocast_uri_format] => 'http://blablalba/blabbitybla/yadda'

纯粹是一个方便的事情,但我更喜欢把我的钥匙表示为符号。

我使用类似于约翰的Rails 3.0 / 3.1,但我有erbparsing文件第一:

 APP_CONFIG = YAML.load(ERB.new(File.new(File.expand_path('../config.yml', __FILE__)).read).result)[Rails.env] 

这允许我在我的configuration中使用ERB,如果需要,就像阅读heroku的redistogo url:

 production: <<: *default redis: <%= ENV['REDISTOGO_URL'] %> 

Rails 4

创build一个自定义configurationyaml并加载它(并使其可用于您的应用程序)类似于database_configuration

创build你的*.yml ,在我的情况下,我需要一个redisconfiguration文件。

config/redis.yml

 default: &default host: localhost port: 6379 development: <<: *default test: <<: *default production: <<: *default host: <%= ENV['ELASTICACHE_HOST'] %> port: <%= ENV['ELASTICACHE_PORT'] %> 

然后加载configuration

config/application.rb

 module MyApp class Application < Rails::Application ## http://guides.rubyonrails.org/configuring.html#initialization-events config.before_initialize do Rails.configuration.redis_configuration = YAML.load_file("#{Rails.root}/config/redis.yml") end end end 

访问值:

Rails.configuration.redis_configuration[Rails.env]类似于你可以通过Rails.configuration.database_configuration[Rails.env]访问你的database.yml Rails.configuration.database_configuration[Rails.env]

build立在奥马尔·阿斯拉姆的优雅的解决scheme,我决定把钥匙转换成符号。 唯一的变化是:

 all_config = YAML.load_file("#{Rails.root}/config/config.yml").with_indifferent_access || {} 

这样,您可以通过符号将键值引用,例如

 AppConfig[:twitter][:key] 

这似乎更加贴近我的眼睛。

(作为一个答案发布,因为我的名声不够高评论奥默尔的答复)

我喜欢简单的configuration。 它允许你有每个环境configuration。

看到我的回应哪里是存储应用程序参数的最佳地点:数据库,文件,代码…?

一个变化,你有什么,这是一个简单的引用到另一个文件。 它看到environment.rb不是不断更新,并没有一堆应用程序特定的东西在里面。 虽然对你的问题“Rails方式不是一个具体的答案?”,也许在那里会有一些讨论。

我更喜欢通过全局应用程序堆栈访问设置。 我避免了局部范围内的多余的全局variables。

configuration/初始化/ myconfig.rb

 MyAppName::Application.define_singleton_method("myconfig") {YAML.load_file("#{Rails.root}/config/myconfig.yml") || {}} 

并访问它。

 MyAppName::Application.myconfig["yamlstuff"] 

我的方式来加载设置Rails初始化之前

允许您在Rails初始化中使用设置,并在每个环境中configuration设置

 # config/application.rb Bundler.require(*Rails.groups) mode = ENV['RAILS_ENV'] || 'development' file = File.dirname(__FILE__).concat('/settings.yml') Settings = YAML.load_file(file).fetch(mode) Settings.define_singleton_method(:method_missing) {|name| self.fetch(name.to_s, nil)} 

您可以通过两种方式获取设置: 设置[“email”]Settings.email

我最好的方式来定制configuration,并在setting.yml丢失时提示消息。

从config / initializers / custom_config.rb中的自定义初始化程序中加载

 setting_config = File.join(Rails.root,'config','setting.yml') raise "#{setting_config} is missing!" unless File.exists? setting_config config = YAML.load_file(setting_config)[Rails.env].symbolize_keys @APP_ID = config[:app_id] @APP_SECRET = config[:app_secret] 

在config / setting.yml中创build一个YAML

 development: app_id: 433387212345678 app_secret: f43df96fc4f65904083b679412345678 test: app_id: 148166412121212 app_secret: 7409bda8139554d11173a32222121212 production: app_id: 148166412121212 app_secret: 7409bda8139554d11173a32222121212