为我的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