当前位置:  开发笔记 > 编程语言 > 正文

为我的Rails应用程序创建自定义配置选项的最佳方法?

如何解决《为我的Rails应用程序创建自定义配置选项的最佳方法?》经验,为你挑选了7个好方法。

我需要为我的Rails应用程序创建一个配置选项.对于所有环境都可以是相同的.我发现,如果我把它设置好environment.rb,它可以在我的视图中使用,这正是我想要的......

environment.rb

AUDIOCAST_URI_FORMAT = http://blablalba/blabbitybla/yadda

效果很好.

但是,我有点不安.这是一个很好的方法吗?有没有更时尚的方式?



1> John Topley..:

对于不需要存储在数据库表中的一般应用程序配置,我喜欢config.ymlconfig目录中创建一个文件.对于您的示例,它可能如下所示:

defaults: &defaults
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *defaults

test:
  <<: *defaults

production:
  <<: *defaults

此配置文件从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,请确保不要在相对配置路径中意外添加前导斜杠.

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

uri_format = APP_CONFIG['audiocast_uri_format']

有关详细信息,请参阅此Railscast.


只是一个FYI,在Rails 3.x中你需要用`Rails.rov`替换`RAILS_ENV`和用'Rails.root`替换`RAILS_ROOT`.
不确定以前的版本但在Rails 4.1中你可以做`Rails.application.config.whatever_you_want = YAML.load_file(Rails.root.join('config','config.yml'))[Rails.env]`
对于Rails 3+,您应该加入相对路径,而不是绝对路径.不要在配置目录前加上斜杠.
@ iphone007确实可以从config目录加载任意yaml文件.请参阅下面的[smathy的回答](http://stackoverflow.com/a/28225785/979091),我认为现在应该是接受的答案.

2> David Burrow..:

Rails 3版本的初始化代码如下(不推荐使用RAILS_ROOT和RAILS_ENV)

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

此外,Ruby 1.9.3使用Psych使合并键区分大小写,因此您需要更改配置文件以将其考虑在内,例如

defaults: &DEFAULTS
  audiocast_uri_format: http://blablalba/blabbitybla/yadda

development:
  <<: *DEFAULTS

test:
  <<: *DEFAULTS

production:
  <<: *DEFAULTS


你不需要``#{Rails.root.to_s}"`; `"#{Rails.root}"``有效.
我推荐`Rails.root.join('config','config.yml')`而不是``#{Rails.root.to_s} /config/config.yml"`
而且,我建议使用:'AppName :: Application.config.custom`而不是APP_CONFIG

3> Ali Masudian..:

Rails> = 4.2

只需YAMLconfig/目录中创建一个文件,例如:config/neo4j.yml.

内容neo4j.yml可以是下面的内容(为简单起见,我在所有环境中使用默认值):

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

现在,您可以访问自定义配置,如下所示:

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

更多信息

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

方便加载当前Rails环境的config/foo.yml.


如果您不想使用yaml文件

正如Rails官方指南所说:

您可以使用config.x属性下的自定义配置通过Rails配置对象配置自己的代码.

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

然后,可以通过配置对象获得这些配置点:

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指南



4> Omer Aslam..:

第1步:创建config/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步:创建config/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']


这是一个出色的解决方案!

5> smathy..:

我只是想在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


只是一个最初给我带来问题的澄清; x不是你想要放入的占位符,它确实需要是字母`x`.
这个答案比最接受的答案更新,更有用.

6> foomip..:

关于这个主题的一些额外信息:

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

".with_indifferent_access"允许您使用字符串键或等效符号键访问哈希值.

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

纯粹是一种方便的东西,但我更喜欢将我的钥匙表示为符号.



7> Jack Chu..:

我使用类似于John for Rails 3.0/3.1的东西,但我首先解析文件:

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

这允许我在我的配置中使用ERB,如果我需要,比如阅读heroku的redistogo网址:

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


我认为我不会每天都需要这个,但对于那些需要的时候,这是一个非常酷的解决方案.我想我会将文件名更改为config.yml.erb虽然匹配rails约定.
推荐阅读
mylvfamily
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有