【发布时间】:2025-11-29 14:05:02
【问题描述】:
我正在尝试创建一个 Rails 应用程序,当环境是开发环境时,它会为一个变量分配一个值,而当环境是生产环境时,它会为同一个变量分配另一个值。我想在我的代码中指定这两个值(硬连线),并让 rails 知道根据正在运行的环境将哪个值分配给变量。我该怎么做?
如果它很重要,我稍后会访问该变量并在模型的类方法中返回它的值。
【问题讨论】:
标签: ruby-on-rails-3
我正在尝试创建一个 Rails 应用程序,当环境是开发环境时,它会为一个变量分配一个值,而当环境是生产环境时,它会为同一个变量分配另一个值。我想在我的代码中指定这两个值(硬连线),并让 rails 知道根据正在运行的环境将哪个值分配给变量。我该怎么做?
如果它很重要,我稍后会访问该变量并在模型的类方法中返回它的值。
【问题讨论】:
标签: ruby-on-rails-3
你可以用初始化器来做到这一点。
# config/initializers/configuration.rb
class Configuration
class << self
attr_accessor :json_url
end
end
# config/environments/development.rb
# Put this inside the ______::Application.configure do block
config.after_initialize do
Configuration.json_url = 'http://test.domain.com'
end
# config/environments/production.rb
# Put this inside the ______::Application.configure do block
config.after_initialize do
Configuration.json_url = 'http://www.domain.com'
end
然后在您的应用程序中,调用变量 Configuration.json_url
# app/controller/listings_controller.rb
def grab_json
json_path = "#{Configuration.json_url}/path/to/json"
end
当您在开发模式下运行时,这将访问http://test.domain.com URL。
当您在生产模式下运行时,这将访问http://www.domain.com URL。
【讨论】:
我喜欢将设置存储在 YAML 中。要根据环境进行不同的设置,使用默认值,你可以有一个初始化文件(比如config/initializers/application_config.rb),如下所示:
APP_CONFIG = YAML.load_file("#{Rails.root}/config/application_config.yml")[Rails.env]
…然后在config/application_config.yml:
defaults: &defaults
my_setting: "foobar"
development:
# add stuff here to override defaults.
<<: *defaults
test:
<<: *defaults
production:
# add stuff here to override defaults.
<<: *defaults
…然后,用APP_CONFIG[:my_setting]拉出设置
【讨论】:
APP_CONFIG['my_setting'] — 这就是您阅读设置的方式。
config/environment.rb 中使用了YAML.load_file(...) 行,就在Application.initialize! 行之前。 (通过Tyler Long)
我在 Rails 3.2 中使用 Yettings gem,它允许我将应用程序变量存储在 config/yettings.yml 中,如下所示:
defaults: &defaults
api_key: asdf12345lkj
some_number: 999
an_erb_yetting: <%= "erb stuff works" %>
some_array:
- element1
- element2
development:
<<: *defaults
api_key: api key for dev
test:
<<: *defaults
production:
<<: *defaults
并像这样访问它们:
#/your_rails_app/config/yetting.yml in production
Yetting.some_number #=> 999
Yetting.api_key #=> "asdf12345lkj"
【讨论】:
你可以这样找出环境:
ruby-1.9.2-p0 > Rails.env
=> "development"
将值存储在config/application.rb 中的全局变量中,例如:
$foo = "something"
您也可以在config/environments/ 文件中分配变量,而不是根据application.rb 中的Rails.env 来决定。看你的情况。
【讨论】: