2009-07-21 9 views
5

Estoy trabajando en un motor para Rails como un complemento. Me gustaría poder realizar los cambios necesarios en la configuración de Rails cuando esté cargada, de modo que pueda especificar sus dependencias Gem así como agregar algunas rutas de carga.¿Cómo puedo modificar la configuración de Rails dentro de un complemento de motor?

El archivo init.rb del complemento tiene acceso al objeto config, pero esto es efectivamente de solo lectura, puede especificar una gema pero no importa, el inicializador debe haberse ejecutado ya en este punto.

Tengo todo esto por ahora, al exigir un archivo con un nuevo bloque de rieles :: inicializador de este modo:

Rails::Initializer.run do |config| 
    config.gem "authlogic", :version => ">= 2.0.9" 
    # etc 
end 

Esto funciona, pero elimina cualquier configuración existente en environment.rb de la aplicación principal.

Tal vez puedo resolver esto teniendo un generador en el motor que agrega algo a environment.rb que carga la configuración del complemento en el escenario correcto, o tal vez hay una forma de agregar un archivo a config/initializers para hacer esto trabajo. Sin embargo, no estoy seguro de cuál es la mejor manera de hacerlo.

Respuesta

1

Me gustaría ir con la ruta config/initializers. Esa es la carpeta estándar para poner el código de configuración específico del complemento y se cargará en el momento correcto.

Para la implementación, intentaría con todas mis fuerzas elegir valores predeterminados razonables para todo lo que me permitiera no tener un archivo de configuración. (entiendo que esto no siempre es posible.)

A continuación me gustaría crear un generador con el plugin que crearía automáticamente el archivo de configuración en config/inicializadores usando:

./script/generate plugin MyPlugin --with-generator 

Por último, me gustaría poner algo en install.rb de mi complemento para ejecutar la secuencia de comandos del generador cuando se instala el complemento. De esta forma, el archivo de configuración se genera automáticamente con la instalación, y el usuario todavía tiene una manera fácil de regenerar si desea restaurar la configuración predeterminada.

+0

Eso suena como una buena aproximación a mí. A diferencia de los archivos de configuración en entornos (desarrollo.rb, etc.) los archivos en config/initializers no tienen acceso al objeto config, ¿sabes por casualidad cómo especificaría las dependencias gem en esta situación? Gracias – DavidNorth

+0

Hasta ahora, la única forma en que puedo resolver esto es cargar un archivo de mi motor como una cadena y evaluarlo desde el bloque Rails :: Initializer en environment.rb para que el archivo tenga acceso a 'config 'y poder llamar a config.gem eval (File.read ("# {RAILS_ROOT} /vendor/plugins/my-engine/config/gems.rb")) Esto es muy feo, pero parece que no puede especificar dependencias de gemas fuera de ese bloque. Supongo que mi generador podría simplemente agregar las líneas relevantes dentro de ese bloque, pero me gustaría mantener los requisitos del motor lo más separados posible. – DavidNorth

0

puede fácilmente añadir esta línea a init.rb (bajo el directorio de plug-in)

config.gem 'quick_magick' 

lo probé con los carriles 2.3.5 y funcionó como magia.

1

¿Está seguro de que desea distribuir esto como un complemento en lugar de una joya? Si empaqueta su motor como una gema, puede especificar dependencias de gemas como parte de su proceso de construcción de gemas. Por ejemplo, si se utiliza joyero para crear su joya que acaba de añadir una sola línea:

s.add_dependency 'authlogic'

Cuando su joya está instalado, se asegurará de que todas las dependencias están instaladas. Google 'jeweller gem dependency' para un ejemplo completo de configuración de Jeweler.

Además, he estado trabajando mucho en mi propio motor de rieles y recientemente extraje una gran cantidad de funcionalidades básicas útiles. Usted puede encontrar esto útil para otros problemas de motor:

http://keithschacht.com/creating-a-rails-3-engine-plugin-gem/

Cuestiones relacionadas