tutorial software rails ejemplos descargar ruby-on-rails codebase

ruby-on-rails - ejemplos - ruby on rails software



¿Ejecutando múltiples sitios desde la misma base de código de rieles? (4)

Tengo un cliente que quiere tomar su aplicación Rails que ha tenido éxito en un nicho y aplicarlo a otro nicho similar. Esta nueva instancia de la aplicación va a comenzar de manera muy similar: todas las mismas funciones, diferentes logotipos y colores. Sin embargo, si el nuevo sitio tiene éxito, inevitablemente necesitará personalizaciones significativas que no deben aplicarse al sitio original. Al mismo tiempo, si se solucionan los errores y se realizan mejoras en una aplicación, entonces ambas aplicaciones deberían poder compartir esas mejoras.

¿Alguien puede sugerir estrategias o recursos que aborden este problema? ¿Cómo puedo evitar que los cambios que se aplican a ambas aplicaciones tomen mucho más tiempo para probar e implementar?

Sí, sé que la respuesta involucra motores SCM, plugins, gemas y Rails. Estas herramientas serán y están siendo utilizadas. pero quiero saber cuándo y cómo usar estas herramientas para resolver este problema.

Los enlaces también son bienvenidos.

Esta pregunta no es lo mismo que:

¿Múltiples sitios web que se ejecutan en el mismo código? En mi pregunta, no estoy ejecutando exactamente la misma aplicación con diferentes configuraciones.

¿Cómo sincronizar los cambios entre múltiples bases de código? Estoy haciendo una pregunta similar, pero específicamente estoy preguntando sobre las aplicaciones de Rails.


Actualmente trabajamos con una configuración bastante similar con lo que estás describiendo.

Comenzamos a desarrollar una aplicación Rails algo grande (ventas, gestión de stock, catálogo de productos, etc.) para un cliente. Después de terminarlo, llegaron varias solicitudes nuevas de funcionalidad casi idéntica.

Sin embargo, la aplicación original tenía que mantenerse, agregar nuevas funciones, corregir errores y otras cosas.

Los extendidos necesitaban mantener la mayoría de la funcionalidad, pero cambiar el aspecto y la apariencia.

Lo que hicimos fue seguir una serie de pasos:

  1. Primero, comenzamos a limpiar el código, extrayendo las referencias de código duro a las tablas, reduciendo y optimizando las consultas, buscando índices perdidos y maneras de mejorar nuestro uso de ActiveRecord
  2. Después de estar algo satisfechos, comenzamos a desarrollar pruebas faltantes. No puedo enfatizar lo suficiente por qué es útil, ya que mantendremos una misma base de código para varias aplicaciones, y necesitamos que la funcionalidad principal esté tan protegida como puede estar de nuevos cambios.
  3. Esa fue también la palabra mágica: funcionalidad básica. Comenzamos a seleccionar la funcionalidad básica que podría reutilizarse y a extraer todo el código genérico. Eso nos dio una mezcla de controladores, modelos y vistas, que comenzamos a convertir en módulos, complementos y gemas. Que va a donde Depende mucho de tu código. Como regla general, la funcionalidad que no tiene que ver con el idioma del dominio va a los complementos (o gemas si no depende demasiado de Rails)
    1. Este enfoque nos llevó a varios complementos, gemas que luego juntamos para volver a ensamblar el proyecto original, y luego llegó a su propio repositorio GIT. De esa manera, teníamos un repositorio principal de "plantillas" que pegaba todos los componentes y varios otros repositorios GIT para cada uno de ellos.
    2. Finalmente, desarrollamos un sistema de temas fácil (básicamente cargando / stylesheets / themes /: theme_name / y obteniendo theme_name de la base de datos). Ya que es un proyecto de intranet, casi podríamos hacer cualquier cosa con el estilo CSS adecuado. Supongo que para trabajar con IE necesitarías un enfoque más complejo.
    3. Luego, solo usamos ese repositorio principal para desarrollar la nueva funcionalidad.

Ahora, ¿cómo lidiamos con los cambios en la base del núcleo? Comenzamos con nuestro repositorio de plantillas. Reparamos o definimos dónde debería estar el arreglo o cambio y lo cambiamos allí o en su gema / complemento correspondiente. Después de probarlo correctamente, lo implementamos en nuestra cuenta de GitHub.

Finalmente, fusionamos / volvemos a generar los otros proyectos de ese repositorio de plantillas, obteniendo las nuevas actualizaciones.

Suena un poco complicado, pero fue solo para la configuración. El flujo de trabajo actual es bastante simple y fácil, con la ventaja dada de trabajar con varios desarrolladores sin mayores problemas.


Con un toque mínimo del sitio principal, podría ser posible usar el código Ruby mientras se extienden las plantillas y se cambian los estilos. He trabajado mucho en eso en Django y el diseño puede verse como:

project/ sites/ site_one/ templates/ models.py settings.py urls.py views.py site_two/ templates/ models.py settings.py urls.py views.py base_app/ settings.py

Podrías intentar hacer algo similar en Rails:

main_webapp/ app/ config/ ... sites/ site_one/ controllers/ models/ views/ site_two/ controllers/ models/ views/

Suponiendo que las funcionalidades son idénticas en todos los sitios pero que solo tienen diseños y estilos diferentes, no habrá ninguno o muy poco modelo y código de controlador. Si desea agregar más funciones a sitios específicos, simplemente pegue el código en la carpeta del sitio deseado.

Django también tiene el concepto de Sites y la ability de buscar plantillas en una carpeta de proyecto específica y una carpeta de aplicación. Puede intentar copiar esas características y llevarlas a Rails para lograr ejecutar múltiples sitios desde un código base.

Reconozco que está buscando una solución Rails, pero aún puede ver cómo se hace en Django y copiar algunas de las características útiles al otro lado. Si me gusta una característica específica de Rails, la transferiré a Django / Python.


Estamos haciendo algo similar en mi empresa. Excepto que actualmente involucra múltiples entornos (producción, prueba, desarrollo). Estamos usando SVN como nuestro SCM para mantener nuestro código directo y nos permite duplicar el entorno estable actual y crear versiones separadas de una aplicación (y cambiar cosas como los logotipos o ciertas funciones). Recomiendo encarecidamente ejecutar el entorno con Apache / Nginx y Phusion''s Passenger . Esto nos permite ejecutar todas estas aplicaciones por separado, en las mismas bases de código / similares. Y eso es. Tenemos bases de datos, una producción y un desarrollo para mantener nuestros datos en vivo separados, pero puede conectar fácilmente dos instancias de aplicaciones al mismo db de esta manera. Ha funcionado muy bien para nosotros hasta ahora al ser capaz de desarrollar, probar y desplegar múltiples aplicaciones web sin desmontar el servidor de producción primario.