respuesta Actualizado
resumo todos mis resultados en mi blog, es mejor que mire hay:
respuesta Antiguo
busqué una solución para esto también, y (De forma complementaria y también para apuntar en esta dirección otros) esto es lo que encontré.
A partir de Rails3.1, los motores se pueden generar fácilmente a través del comando rails plugin new my_plugin --full
. Esto genera el esqueleto para un motor.
--full
significa que el motor se "fusionará" directamente en la aplicación incluida, por lo que, por ejemplo, los controladores deben ser accesibles directamente como si estuvieran definidos en la aplicación incluida. Esto le permite, por ejemplo, tener un archivo de ayuda en my_engine/app/helpers/my_helper.rb
que se combinará en la aplicación incluida app/helpers/my_helper.rb helper
.
Existe otra opción --mountable
que crea un espacio de nombres para el motor para que sus controladores, etc. nunca colisionen con los de la aplicación. Esto da como resultado, p. un asistente está en my_engine/app/helpers/my_engine/my_helper.rb
que no colisionará con un helper app/helpers/my_helper.rb
en su aplicación incluida.
Ahora la parte más interesante:
Dentro de la carpeta del motor generada test
, hay una carpeta dummy
que mantiene una completa rieles! ¿Para qué es esto?
Cuando desarrolle un motor, sus funcionalidades deben funcionar por sí solas, y también debe probarse completamente por sí mismo. Por lo tanto, es la forma "incorrecta" de desarrollar un motor "dentro" de otra aplicación de Rails (aunque esto intuitivamente a menudo se sentirá bien al extraer funcionalidades existentes de una aplicación de Rails en un motor), y teóricamente tampoco es necesario volver a cargar el motor código con cada solicitud a la aplicación incluida.
La manera "correcta" parece ser esta: desarrolla y prueba tu motor, como si fuera una aplicación completa de Rails con la aplicación dummy
. Allí puede hacer todo lo que puede hacer en cualquier aplicación Rails "normal", p. cree controladores, modelos, vistas, etc. que utilicen las funcionalidades que el motor debe proporcionar. También puede iniciar un servidor normalmente usando rails s
en su directorio test/dummy
y acceder a la aplicación ficticia en localhost:3000
, y al ejecutar sus pruebas, la aplicación dummy
se utiliza automáticamente para las pruebas de integración. ¡Muy agradable! :-)
Hay que tener cuidado donde poner tus cosas:
- Cualquier funcionalidad que está destinado a ser utilizado dentro de otra aplicación Rails entra en
my_engine/app
, mientras que cualquier funcionalidad que sólo se necesita para probar la la funcionalidad del motor entra en test/dummy/app
.
A continuación, después se puede cargar fácilmente su motor en Gemfile
como éste de su aplicación principal: gem 'my_engine', :path => 'path/to/my_engine'
o publicarla en GitHub como una joya.
(Una cosa interesante (y para volver al tema de este tema) es que cuando inicio el servidor del dummy, ¡entonces todos los cambios en el motor parecen estar reflejados en él! Así que de alguna manera parece ser posible incluir un motor dentro de una aplicación de Rails sin guardarlo en caché ...? No sé cómo sucede esto.)
En resumen: un motor proporciona una funcionalidad que puede soportar por sí solo, por lo que también debe desarrollarse y probado por sí mismo. Luego, cuando ha alcanzado un estado estable, puede ser incluido por cualquier otra aplicación que necesite su funcionalidad.
He aquí algunos recursos que encuentro útil:
espero que esta respuesta es útil. Todavía soy muy nuevo en los motores en general, así que si hay información incorrecta, por favor díganme, y la corregiré.
Eso fue hace un tiempo atrás, también puedes usar load sin el eager_load_path.Cree helper que tome la cadena como parámetro y use load si env es dev y requiera si env is prod. Si lo intenta, avísenme si funciona :) –
Parece que no funciona en Rails 3.0.20 con o sin el '}' adicional al final de la cadena. – Ritchie
Esto no funcionó para mí en 3.2.13 - en su lugar, después de agregar el eager_load_paths, todos mis otros archivos (controladores + modelos) dejaron de volver a cargarse entre las solicitudes también! (Vuelve a la normalidad si elimino esa línea.) Bizarro. Finalmente lo conseguí trabajando con esta respuesta: http://stackoverflow.com/a/10954365/1164573 –