Rails 3 / Настройка пользовательских переменных среды - PullRequest
16 голосов
/ 26 января 2011

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

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

Ответы [ 4 ]

25 голосов
/ 10 февраля 2011

Вы можете сделать это с помощью инициализаторов.

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

15 голосов
/ 21 марта 2012

Мне нравится хранить настройки в 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 голосов
/ 24 февраля 2012

Я использую Yettings gem в 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"
0 голосов
/ 26 января 2011

Вы можете узнать окружающую среду, как это:

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

Сохраните значение в глобальной переменной в вашем config/application.rb, например:

$foo = "something"

Вы также можете назначить переменную в ваших config/environments/ файлах вместо того, чтобы выбирать на основании Rails.env в application.rb. Зависит от вашей ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...