Rails 3/Настройка пользовательских переменных окружения

Я пытаюсь создать приложение rails, которое присваивает одно значение переменной, когда среда является средой разработки, и другое значение для этой же переменной, когда среда является производственной средой. Я хочу указать оба значения в моем коде (hardwired) и знать, какие значения для переменной присваиваются переменной, на основе которой выполняется среда. Как это сделать?

В случае, если это важно, я позже получаю доступ к этой переменной и возвращаю ее значение в методе класса модели.

Ответ 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

Когда вы работаете в режиме разработки, это приведет к URL http://test.domain.com.

Когда вы работаете в режиме производства, это приведет к URL http://www.domain.com.

Ответ 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]

Ответ 3

Я использую "Жемчужина" в Rails 3.2, который позволяет мне хранить мои переменные приложения в 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/ вместо того, чтобы решать на основе Rails.env в application.rb. Зависит от вашей ситуации.