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.



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

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í


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

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

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.


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.




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.


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.


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.


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']

-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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.