rails how content_for collection application ruby-on-rails dry partials

ruby on rails - how - ¿Dónde colocar parciales compartidos por toda la aplicación en Rails?



render a partial rails (6)

En general, tengo una carpeta compartida en mis vistas que contiene parciales comúnmente utilizados.

¿Dónde iría para colocar archivos parciales compartidos por más de un modelo? Tengo una página llamada crop.html.erb que se usa para un modelo - Photo . Ahora me gustaría utilizarlo para otro modelo llamado User también.

Pude copiar y pegar el código pero no es muy seco, así que pensé que lo movería a un parcial.

Dado que se comparte entre dos modelos, ¿ dónde ubicaría ese parcial ?

¡Gracias!


La convención de Rails es poner parciales compartidos en /app/views/shared .


No importa dónde los pongas. Puede representar cualquier parcial en cualquier ubicación arbitraria al proporcionar la ruta del archivo para su render ; no es necesario que esté asociado con el controlador que lo está representando. Utilizo un directorio llamado simplemente partials en el directorio de view , y llamo parciales en él de esta manera:

render :partial => ''partials/mypartial''


TL; DR

Rails 3.1, Rails 4, Rails 5 y lo que viene después

app/views/application

El motor busca esta ruta automáticamente si la vista no se encuentra en la ruta del controlador.

Carriles 3 y anteriores

app/views/shared

El motor NO busca esta ruta automáticamente.

Larga historia

Rails 3 (y la versión anterior) no tienen una ubicación predeterminada para almacenar vistas compartidas.

La convención no oficial es almacenar vistas compartidas en la aplicación / vistas / compartidas . Sin embargo, donde sea que termines almacenándolos, debes especificar la ruta

# render app/views/shared/menu.html.erb <%= render :partial => "shared/menu" %>

Esta sugerencia fue popularizada por Agile Web Development con Rails .

Rails 3.1 introduce un estándar oficial para dónde almacenar vistas compartidas:
aplicación / vistas / aplicación

Gracias a este estándar, el motor ahora busca automáticamente plantillas en la aplicación / vistas / aplicación . Como resultado, ya no tiene que usar la ruta completa .

Los curiosos pueden seguir robots.thoughtbot.com/directory-for-shared-partials-in-rails el proceso de pensamiento detrás de esta decisión.

Antigua sintaxis

# render app/views/application/menu.html.erb # unless menu.html.erb is found in appp/views/my_controller <%= render :partial => "menu" %>

Nueva sintaxis

# render app/views/application/menu.html.erb # unless menu.html.erb is found in appp/views/my_controller <%= render partial: "menu" %>

Por supuesto, aún puede colocar sus vistas compartidas donde quiera y hacer referencia a ellas por ruta

<%= render :partial => "my_own_special_shared_folder/menu" %>

Sin embargo, a menos que tenga una muy buena razón para hacerlo, siga el nuevo estándar y almacene sus vistas compartidas en la app/views/application .


La Vista de rieles usa app/views/layouts para parciales compartidos como encabezado y pie de página, pero la Guía de Ruby on Rails usa app/views/shared en un ejemplo . Supongo que se trata de preferencia personal. layouts para cosas de alto nivel como un navegador principal o un pie de página, pero los shared para cosas más limitadas a nivel de controlador como un formulario.


Actualizar

La herencia de diseño se encuentra ahora en las guías en el diseño y la representación La herencia de la plantilla funciona de manera similar.

Rails 3.1 y las siguientes versiones implementan herencia de plantilla, por lo que creo que el lugar correcto para los parciales compartidos ahora es /app/views/application/ , digamos que está en products#index , puede hacer lo siguiente:

-# products#index = render @products.presence || ''empty'' -# /app/views/application/_empty.html.haml There are no items

Por cierto, es una application porque la conexión es la herencia del controlador, por lo que esto supone que ProductsController < ApplicationController

De esta forma, si implementa /app/views/products/_empty.html.haml que se tomará, lo anterior es una alternativa para todos los parciales faltantes, y no puedo verificarlo ahora, pero creo que incluso para la plantilla misma ...

Railscast: ¡herencia de plantilla!