2011-01-25 9 views
16

Estoy intentando crear una aplicación de rieles que asigna un valor a una variable cuando el entorno es de desarrollo y otro valor a esa misma variable cuando el entorno es de producción. Quiero especificar ambos valores en mi código (cableado) y que los rieles conozcan qué valor asignar a la variable en función de qué entorno se esté ejecutando. ¿Cómo hago esto?Rails 3/Setting Custom Environment Variables

En caso de que sea importante, más tarde accedo a esa variable y regreso su valor en un método de clase de un modelo.

Respuesta

25

Puede hacerlo con inicializadores.

# 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 

Luego, en su aplicación, llame a la variable Configuration.json_url

# app/controller/listings_controller.rb 
def grab_json 
    json_path = "#{Configuration.json_url}/path/to/json" 
end 

Cuando se está ejecutando en el modo de desarrollo, este llegará a la URL http://test.domain.com.

Cuando está ejecutando en modo de producción, esto llegará a la URL http://www.domain.com.

+1

¿Alguna posibilidad de que se rompa en 3.1? Funcionó como un encanto en mi aplicación 3.0, ahora obteniendo NoMethodError (método indefinido 'test_conf' para ActiveSupport :: Configurable :: Configuración: Clase): –

+0

# config/application.rb clase Aplicación lnguyen55

+8

Hay una forma mucho mejor de hacerlo con Rails 3+. Puede usar la configuración existente para crear config.json_url = '...' Lo expliqué más adelante en http://jasonnoble.org/2011/12/updated-rails3-custom-environment-variables.html –

-2

Puede averiguar el entorno como este:

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

tienda el valor de una variable global en su config/application.rb por ejemplo:

$foo = "something" 

También podría asignar la variable en sus config/environments/ archivos en lugar de decidir basado en Rails.env en application.rb. Depende de tu situación

3

utilizo el Yettings gem en Rails 3.2, que me permite guardar mis variables de aplicación en config/yettings.yml así:

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 

y acceder a ellos de esta manera:

#/your_rails_app/config/yetting.yml in production 
Yetting.some_number #=> 999 
Yetting.api_key #=> "asdf12345lkj" 
15

me gusta para almacenar los ajustes en YAML. Para tener diferentes configuraciones basadas en el medio ambiente, con valores predeterminados, puede tener un fichero de inicialización (por ejemplo config/initializers/application_config.rb) así:

APP_CONFIG = YAML.load_file("#{Rails.root}/config/application_config.yml")[Rails.env] 

... y luego en 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 

... a continuación, tire hacia afuera la configuración con APP_CONFIG[:my_setting]

+2

¿Cómo se puede usar el "APP_CONFIG" en el código? Aparece un error: constante no inicializada MyController :: APP_CONFIG – Jojje

+0

@Jojje, reinicie la aplicación. Consulte los enlaces de rails dedicados si tiene más preguntas http://railscasts.com/episodes/85-yaml-configuration-file. También las teclas de símbolos no funcionan para mí. 'APP_CONFIG ['my_setting']' - así es como lees la configuración. – jibiel

+1

Necesitaba esta configuración en otros inicializadores, así que terminé usando la línea 'YAML.load_file (...)' dentro de 'config/environment.rb', justo antes de la línea' Application.initialize! '. (a través de [Tyler Long] (http://stackoverflow.com/a/11054390/361609)) – colllin