Cómo definir variables de configuración personalizadas en rieles

337

Me preguntaba cómo agregar variables de configuración personalizadas a una aplicación de rieles y cómo acceder a ellas en el controlador, por ejemplo, quiero poder definir un directorio upload_directory en los archivos de configuración, por ejemplo desarrollo.rb y poder acceder a él en uno de mis controladores

En segundo lugar, estaba planeando tener soporte S3 para cargas en mi aplicación, si quisiera agregar un archivo yaml con acceso s3, clave secreta, ¿cómo lo inicializo en mi aplicación Rails y cómo accedo a los valores que he definido? en ese archivo de configuración.

Shiv
fuente
1
Duplicado: stackoverflow.com/questions/592554/…
John Topley
Ligeramente relacionado: no olvide reiniciar el servidor al agregar nuevas variables de configuración.
Damien Ó Ceallaigh

Respuestas:

165

Actualización 1

Muy recomendable: voy con la gema de configuración de Rails hoy en día por el control de grano fino que proporciona.

Actualización2

Si desea una solución rápida, verifique la respuesta de Jack Pratt a continuación.

Aunque mi respuesta original a continuación todavía funciona, esta respuesta ahora está desactualizada. Recomiendo mirar las actualizaciones 1 y 2.

Respuesta original

Para una solución rápida, ver la pantalla "Archivo de configuración YAML" emitida por Ryan Bates debería ser muy útil.

En resumen:

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

# application.rb
if APP_CONFIG['perform_authentication']
  # Do stuff
end
khelll
fuente
6262
Esta respuesta está desactualizada. Ver stackoverflow.com/questions/1450285/… a continuación
mattwynne
8
@matt: ¿Está desactualizado porque Rails 3 ha sido lanzado, o porque todos están ahora en Rails 3, o ...?
Lasse V. Karlsen
Gracias por señalar lo anticuado. Odio eso de Rails: el código de hace 1 año es demasiado antiguo.
jcollum
2
Para cualquiera que quiera usar el método YAML en Rails 3+, tendrá que reemplazar RAILS_ENVcon Rails.envy RAILS_ROOTcon Rails.root.
Ryan
Intenté rails_config. En la documentación me indican que registre RailsConfig en mi app.rb. Supongo que app.rb = config / application.rb. Pero, ¿en qué parte de la aplicación.rb debo colocar la línea de registro RailsConfig?
Nhím Hổ Báo
375

En Rails 3, los datos de configuración personalizados específicos de la aplicación se pueden colocar en el objeto de configuración de la aplicación. La configuración se puede asignar en los archivos de inicialización o en los archivos de entorno; por ejemplo, para una aplicación determinada MyApp:

MyApp::Application.config.custom_config_variable = :my_config_setting

o

Rails.configuration.custom_config_variable = :my_config_setting

Para leer la configuración, simplemente llame a la variable de configuración sin configurarla:

Rails.configuration.custom_config_variable
=> :my_config_setting

ACTUALIZAR Rieles 4

En Rails 4 hay una nueva forma para esto => http://guides.rubyonrails.org/configuring.html#custom-configuration

ingrese la descripción de la imagen aquí

Jack Pratt
fuente
11
Esto funciona para mi. Puse mi configuración de entorno específica en entornos / {environment} .rb, p. Ej., Assets / development.rb. Asegúrese de reiniciar su servidor después de modificarlo. Puede haber técnicas más elegantes, pero estoy actualizando una aplicación existente que anteriormente usaba ENV ['XXX'] en el mismo archivo, y dado que quiero limitar la cantidad de refactorización durante la actualización, funcionó bien.
pduey
13
Esta es una asignación, pero ¿cómo se accede a este valor entonces?
kevzettler
99
Si mira en el archivo application.rb de una aplicación rails 3.x, dice "La configuración de la aplicación debe ir a los archivos en config / initializers" según esta respuesta. Hay mucha documentación sobre cómo acceder a la variable ( edgeguides.rubyonrails.org/configuring.html ). Por ejemplo, en un archivo llamado some_variables.rb en la carpeta de inicializadores, coloque la variable como se describe anteriormente (reemplazando MyApp con el nombre de su aplicación) y luego, cuando quiera usarla, simplemente llame a config.custom_config_variable. Por supuesto, puede usar el nombre de variable que desee . @Jack Pratt, ¿podrías editar una respuesta más completa?
jamesc
48
Amigo, simple: Ruta: config/environments/production.rb Configuración: config.whatever = false Acceda a cualquier lugar: Rails.configuration.whatever
Victor S
55
Tenga en cuenta que si configura algo solo en producción e intenta acceder a él en otro entorno, se quejaría undefined method.
lulalala
69

En Rails 3.0.5, el siguiente enfoque funcionó para mí:

En config/environments/development.rb, escribe

config.custom_config_key = :config_value

El valor custom_config_keypuede ser referenciado desde otros archivos usando

Rails.application.config.custom_config_key
Rob Dawson
fuente
44
Tenga en cuenta que si configura algo solo en producción e intenta acceder a él en otro entorno, se quejaría undefined method.
lulalala
Intenté esto en rails 4.1 y method_missing': undefined method obtengo errores, "... store 'para # <Rails :: Application :: Configuration: 0x007f9f735b7240> ...". Intenté agregar la variable de configuración "config.store.works".
Spundun
1
@Spundun Recibes ese error, porque Rails no sabe qué storees. Para utilizar el método en esta respuesta, puede cambiar el nombre de su variable store_workso crear un config.storebloque worksdefinido en ella.
Paul Pettengill
Gracias, finalmente lo descubrí. Que estos son hashes anidados, así que tengo que inicializar hashes vacíos de forma recursiva si voy a usar puntos en mis nombres de configuración.
Spundun
31

Esto funciona en rails 3.1:

en config / environment.rb (o en config / environment / .. para apuntar a un entorno específico):

YourApp::Application.config.yourKey = 'foo'

Estará accesible en el controlador o en vistas como esta:

YourApp::Application.config.yourKey

(Su aplicación debe ser reemplazada por el nombre de su aplicación).

Nota : es el código Ruby, por lo que si tiene muchas claves de configuración, puede hacer esto:

en config / environment.rb:

YourApp::Application.configure do
  config.something = foo
  config.....
  config....
  .
  config....
end
Alain Beauvois
fuente
2
camelCase: o usa snake_case!
siegy22
30

En rieles 4

Suponiendo que coloca sus variables personalizadas en un archivo yaml:

# config/acme.yml
development:
  :api_user: 'joe'
  :api_pass: 's4cret'
  :timeout: 20

Crea un inicializador para cargarlos:

# config/initializers/acme.rb
acme_config = Rails.application.config_for :acme

Rails.application.configure do
  config.acme = ActiveSupport::OrderedOptions.new
  config.acme.api_user = acme_config[:api_user]
  config.acme.api_pass = acme_config[:api_pass]
  config.acme.timeout  = acme_config[:timeout]
end

Ahora, en cualquier lugar de su aplicación, puede acceder a estos valores de la siguiente manera:

Rails.configuration.acme.api_user

Es conveniente que Rails.application.config_for :acmecargue acme.ymly use el entorno correcto.

pymkin
fuente
21

Desde Rails 4.2, sin gemas adicionales, puede cargar config / hi.yml simplemente usando Rails.application.config_for :hi.

Por ejemplo:

  1. touch config/passwords.yml

        #config/passwords.yml
        development:
          username: 'a'
          password: 'b'
        production:
          username: 'aa'
          password: 'bb'
  1. touch config/initializers/constants.rb

    #config/initializers/constants.rb
    AUTHENTICATION = Rails.application.config_for :passwords
  1. y ahora puedes usar AUTHENTICATIONconstante en todas partes en tu aplicación:

    #rails c production
    :001> AUTHENTICATION['username'] => 'aa'
  2. luego agregue passwords.yml a .gitignore : echo /config/passwords.yml >> .gitignorecree un archivo de ejemplo para su comodidad cp /config/passwords.yml /config/passwords.example.ymly luego simplemente edite su archivo de ejemplo en su consola de producción con los valores de producción reales.

Lakesare
fuente
13

Solo quería actualizar esto para las últimas cosas interesantes en Rails 4.2, ahora puede hacerlo dentro de cualquiera de sus config/**/*.rbarchivos:

config.x.whatever.you.want = 42

... y esto estará disponible en su aplicación como:

Rails.configuration.x.whatever.you.want

Ver más aquí: http://guides.rubyonrails.org/configuring.html#custom-configuration

pequeño
fuente
8

Echa un vistazo a esta joya ordenada haciendo exactamente eso: https://github.com/mislav/choices

De esta manera, sus datos confidenciales no estarán expuestos en proyectos de código abierto

Flov
fuente
4

Creé un complemento simple para la configuración de YAML: Creé Yettings

Funciona de manera similar al código en la respuesta de khelll, pero solo necesita agregar este archivo de configuración YAML:

app/config/yetting.yml

El complemento crea dinámicamente una clase que le permite acceder a la configuración de YML como métodos de clase en su aplicación de la siguiente manera:

Yetting.your_setting

Además, si desea utilizar múltiples archivos de configuración con nombres únicos, puede colocarlos en un subdirectorio dentro de la aplicación / configuración de esta manera:

app/config/yettings/first.yml
app/config/yettings/second.yml

Entonces puede acceder a los valores de esta manera:

FirstYetting.your_setting
SecondYetting.your_setting

También le proporciona configuraciones predeterminadas que pueden anularse por entorno. También puede usar erb dentro del archivo yml.

johnmcaliley
fuente
El repositorio oficial ahora está en: github.com/charlotte-ruby/yettings (el revisor SO rechazó mi edición diciendo que es demasiado menor)
lulalala
4

Si usa Heroku o necesita mantener la configuración de su aplicación como variables de entorno, la gema de Figaro es muy útil.

MikeH
fuente
2

Me gusta usar la configuración de rieles para valores de configuración global que necesitan ser cambiables a través de la interfaz web.

citar
fuente
2
No quiero usar complementos adicionales, etc., ya que estoy aprendiendo rieles, por lo que la mejor manera de hacerlo sería sin ningún complemento.
Shiv
Tenga en cuenta que esto utiliza una base de datos para almacenar configuraciones, que pueden ser demasiado pesadas para algunas personas.
lulalala
0

Algo que hemos comenzado a hacer en el trabajo es el hash ordenado de ActiveSupport

Lo que le permite definir su configuración limpiamente dentro de los archivos de entorno, por ejemplo

config.service = ActiveSupport::OrderedOptions.new
config.service.api_key = ENV['SERVICE_API_KEY']
config.service.shared_secret = ENV['SERVICE_SHARED_SECRET']
mdb29
fuente
-5

Sugeriría un buen enfoque sobre cómo lidiar con la configuración en su aplicación. Hay tres reglas básicas:

  • cambie su configuración, no un código;
  • usar configuraciones sobre condiciones;
  • escribir código que signifique algo.

Para tener una descripción más detallada, siga este enlace: Configuración de rieles de la manera adecuada

paladiy
fuente