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
. Зависит от вашей ситуации.