Creo que tienes una idea ligeramente incorrecta detrás de lo que sus expectativas para el config/application.rb se le proporciona. Las clases propias de ActiveRecord :: Base y ActiveController :: Base usan la clase Rails :: Application :: Configuration que está configurada en config/application.rb. Los atributos no están disponibles en las clases que descienden de cualquiera de las clases Base, ni sus clases propias. Esta es la razón por la cual se están ejecutando errores en ApplicationController.
En general, hay dos formas de realizar inicializaciones de configuración en una aplicación de Rails. La primera forma es crear un módulo de configuración y valores de carga luego en ella a través de inicializador:
En primer lugar, crear un módulo Twiter Config:
#lib/twitter_config.rb
module TwitterConfig
def self.config
@@config ||= {}
end
def self.config=(hash)
@@config = hash
end
end
Crear un archivo de configuración YAML:
# config/twitter.yaml
development: &base
key: "foo"
secret: "bar"
test:
<<: *base
key: "foo2"
production:
<<: *base
secret: "barbar"
Alternativamente, si no tiene la intención de agregar config/twitter.yaml a su SCM, puede omitir esto y configurar la clave y el secreto a través de variables de entorno. Esta sería la solución sugerida para una aplicación con un repositorio de SCM público desplegado en Heroku.
A continuación, cargar y configurar el valor a través de un inicializador:
#config/initializers/01_twitter.rb
require 'twitter_config'
TwitterConfig.config = YAML.load_file("config/config.yml")[Rails.env].symbolize_keys
Por lo general es una buena práctica para numerar los archivos de inicializador como carriles de los cargará con el fin de acuerdo con su nombre de archivo. Si está inicializando un almacén de datos y eso es crítico para otros pasos, entonces necesita el número más bajo. Como alternativa, si está utilizando variables de entorno, este sería el archivo de inicio:
#config/initializers/01_twitter.rb
require 'twitter_config'
TwitterConfig.config[:key] = ENV['twitter_config_key']
TwitterConfig.config[:secret] = ENV['twitter_config_secret']
A lo largo de la aplicación Rails, ahora tiene acceso a los valores de configuración con TwitterConfig.config [: clave] & TwitterConfig.config [: secreto]. Puede incluir el módulo también, solo tenga cuidado con los conflictos.
También puede simplemente cargar los valores como una constante global. Se siente un poco feo para mí, sin embargo:
#config/application.rb
TWITTER_CONFIG = YAML.load_file("config/twitter.yaml")[Rails.env]
Bloody buena respuesta, muchas gracias. –
¡Reajustó las variables a cero en el servidor de desarrollo! –
Tengo algunos problemas para hacer que esto funcione en una aplicación de Rails 3.1 con Ruby 1.9.2-p180. En mi aplicación, si tuviera que llamar a TwitterConfig.method, simplemente me daría un error. Sin embargo, si inspecciono TwitterConfig.instance_methods, puedo ver claramente los métodos definidos. – Emerson