Rails 3 / 设置自定义环境变量

Posted

技术标签:

【中文标题】Rails 3 / 设置自定义环境变量【英文标题】:Rails 3 / Setting Custom Environment Variables 【发布时间】:2011-06-15 13:29:11 【问题描述】:

我正在尝试创建一个 Rails 应用程序,当环境是开发环境时,它会为一个变量分配一个值,而当环境是生产环境时,它会为同一个变量分配另一个值。我想在我的代码中指定这两个值(硬连线),并让 rails 知道根据正在运行的环境将哪个值分配给变量。我该怎么做?

如果它很重要,我稍后会访问该变量并在模型的类方法中返回它的值。

【问题讨论】:

【参考方案1】:

你可以用初始化器来做到这一点。

# 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。

【讨论】:

这有可能在 3.1 中被破坏吗?在我的 3.0 应用程序中像魅力一样工作,现在得到 NoMethodError(ActiveSupport::Configurable::Configuration:Class 的未定义方法'test_conf'): # config/application.rb class Application Rails 3+ 有更好的方法来做到这一点。您可以使用现有配置来创建 config.json_url = '...' 我在jasonnoble.org/2011/12/… 上进一步解释了它 这可以通过使用 .yml 文件***.com/questions/11648620/…来更轻松地进行管理【参考方案2】:

我喜欢将设置存储在 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”呢?我收到一个错误:未初始化的常量 MyController::APP_CONFIG @Jojje,重新启动应用程序。如果您有任何其他问题railscasts.com/episodes/85-yaml-configuration-file,请参阅专门的 railscast。符号键也对我不起作用。 APP_CONFIG['my_setting'] — 这就是您阅读设置的方式。 我在其他初始化程序中需要这个配置,所以我最终在config/environment.rb 中使用了YAML.load_file(...) 行,就在Application.initialize! 行之前。 (通过Tyler Long)【参考方案3】:

我在 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"

【讨论】:

【参考方案4】:

你可以这样找出环境:

ruby-1.9.2-p0 > Rails.env
  => "development"

将值存储在config/application.rb 中的全局变量中,例如:

$foo = "something"

您也可以在config/environments/ 文件中分配变量,而不是根据application.rb 中的Rails.env 来决定。看你的情况。

【讨论】:

以上是关于Rails 3 / 设置自定义环境变量的主要内容,如果未能解决你的问题,请参考以下文章

如何为运行脚本设置自定义环境变量

Win10小技巧|自定义path环境变量

Postman使用手册3——环境变量

Vs2010 中怎么包含自定义的环境变量?

谁在运行Puma或Passenger时设置RAILS_MAX_THREADS环境变量?

R语言-环境变量设置