2011-01-25 5 views
16

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

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

ответ

25

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

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

+1

Есть ли шанс, что это сломано в 3.1? Работал как шарм в моем приложении 3.0, теперь получаю NoMethodError (неопределенный метод «test_conf» для ActiveSupport :: Configurable :: Configuration: Class): –

+0

# config/application.rb класс Приложение lnguyen55

+8

Существует гораздо лучший способ сделать это с помощью Rails 3+. Вы можете использовать существующую конфигурацию для создания config.json_url = '...' Я объяснил это далее http://jasonnoble.org/2011/12/updated-rails3-custom-environment-variables.html –

-2

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

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

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

$foo = "something" 

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

3

Я использую 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" 
15

Мне нравится хранить настройки в 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]

+2

Как вы можете использовать «APP_CONFIG» в коде? Я получаю сообщение об ошибке: uninitialized constant MyController :: APP_CONFIG – Jojje

+0

@Jojje, перезапустите приложение. См. Раздел посвященный railscast, если у вас есть дополнительные вопросы. Http://railscasts.com/episodes/85-yaml-configuration-file. Символьные клавиши для меня не работают. 'APP_CONFIG ['my_setting']' - так вы читаете настройки. – jibiel

+1

Мне нужна эта конфигурация в других инициализаторах, поэтому я закончил использование строки 'YAML.load_file (...)' в 'config/environment.rb', непосредственно перед строкой' Application.initialize! '. (через [Тайлер Лонг] (http://stackoverflow.com/a/11054390/361609)) – colllin

Смежные вопросы