tutorial rails mvc generate for existing examples ruby-on-rails ruby model-view-controller

mvc - Dos controladores para una vista compartida en Ruby on Rails



ruby on rails tutorial (5)

Tengo dos controladores para dos modelos respectivos, por ejemplo, fotos y categorías. los métodos index y show son muy similares en cada controlador, y las vistas son idénticas. ¿Cuál es el mejor método para compartir la vista de los dos modelos?

He pensado dos opciones:

  • Usa un ayudante. En el asistente se colocará el código de la vista y se llamará al ayudante desde cada vista (fotos / vistas y categorías / vistas)

  • Use un parcial en cada vista. Creo que es una solución más limpia, pero veo enormes DRY en mi mente cuando voy a codificar esta solución.

Entonces, tengo dos controladores de dos modelos, cada uno en y expone un objeto @photo (controlador de fotos con todas las fotos y controlador de categorías con solo las fotos de la categoría seleccionada) y necesito una vista para mostrar ambos.

Estoy buscando una solución elegante para esto, quejándome de los principios REST y DRY. ¿Alguna idea?

Gracias por adelantado.


@bjeanes Si todas sus vistas de eliminación son las mismas, puede crear views / default / delete.html.erb y todas las acciones de eliminación lo usarán.

Eso es lo que estoy haciendo: la mayoría de mis puntos de vista están en defecto, y creo los específicos solo cuando sea necesario

Actualización: Ok, esta publicación es de 2009, de todos modos, voy a mantener mi comentario aquí en caso de que alguien llegue aquí desde Google como lo hice.


Acerca de la first respuesta:

Si el parcial debe representarse desde una vista:

<%= render :partial => "shared/photo" %>

y el parcial debe estar en la aplicación / views / shared / _photo.html.erb


Esto parece un buen caso de uso para la gema Cells .


Tengo una situación similar con uno de mis proyectos. Todas las vistas de eliminación para la mayoría de los controladores se diseñan del mismo modo, muestran los mismos cuadros de confirmación y simplemente representan de forma predecible el objeto que se está eliminando.

La solución fue bastante simple y elegante en mi opinión. En pocas palabras, lo que nosotros (los desarrolladores) hicimos fue crear un nuevo directorio en la app/views llamado shared y poner puntos de vista compartidos allí. Estos podrían ser archivos de plantilla completos o solo parciales.

Sugiero usar una plantilla compartida (en directorios de vista de categorías y fotos, pero no en el directorio compartido) y renderizarla manualmente desde la vista.

por ejemplo, tener un método como tal en ambos controladores y una app/views/shared/photo.html.erb archivo app/views/shared/photo.html.erb :

def show @photo = Photo.first # ... or whatever here render :template => ''shared/photo'' end

Esto debería representar con éxito la plantilla compartida. Es la ruta DRYest y no tiene la sensación de contaminación que se obtiene al usar una vista más o menos vacía en el directorio de vista de cada controlador solo para incluir un parcial compartido, como entiendo que su pregunta sugiere.


Usaría un ayudante porque se comparten entre puntos de vista. Para la parte HTML, usaría parciales para que sea una mezcla de ambas maneras.