2010-03-05 18 views
45

¿Dónde debo ir para colocar archivos parciales compartidos por más de un modelo? Tengo una página llamada crop.html.erb que se utiliza para un modelo - Photo. Ahora me gustaría usarlo para otro modelo llamado User también.¿Dónde poner parciales compartidos por toda la aplicación en Rails?

I podría copiar y pegar el código, pero eso 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!

Respuesta

56

Los rieles convención es poner parciales compartidos en /app/views/shared.

+3

parciales en/app/views/shared/no están siendo recogidos en mi aplicación Rails 4 por alguna razón?!? – Meltemi

+0

@Meltemi Vea la respuesta de ecoologic. – kkurian

+10

No más, para rails 4, el directorio correcto es app/views/application, y creo que tiene sentido ... https://robots.thoughtbot.com/directory-for-shared-partials-in- rails –

3

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

0

No importa donde se los pone. Puede representar cualquier parcial en cualquier ubicación arbitraria proporcionando la ruta del archivo al render; no necesita asociarse con el controlador que la está representando. Yo uso un directorio llamado simplemente partials bajo el directorio view, y llamar a los parciales de esta manera:

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

oh, estoy muy enterado. Estaba interesado en la mejor práctica. ¡Gracias, sin embargo! –

+0

¿cuál es la diferencia entre 'render 'partials/mypartial'' y' render partial:' partials/mypartial'? –

45

actualización

herencia de diseño se encuentra ahora en las guías bajo layout and rendering herencia de plantillas funciona de manera similar.

Rails 3.1 y versiones siguientes implementar la herencia de plantillas, así que creo que el lugar correcto para los parciales compartidos es ahora /app/views/application/, dicen 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 application porque la conexión es la herencia del controlador, por lo que se asume ProductsController < ApplicationController

De esta manera si implementa /app/views/products/_empty.html.haml que se tomará, lo anterior es una alternativa para todos los par faltantes tials, y no pueden comprobar en este momento, pero creo que incluso para la propia plantilla ...

Railscast: template inheritance!

+2

estoy absolutamente de acuerdo con usted , la carpeta de aplicaciones debajo de la aplicación/vistas es la mejor opción! –

+0

sí, olvidé el prefijo 'app /', actualizado, gracias – ecoologic

+2

He estado buscando esta solución por un tiempo. No puedo creer que la guía ni ningún otro tutorial en línea descuiden mencionar esto. – LunaCodeGirl

4

The Rails View utiliza para app/views/layouts parciales compartidos como cabecera y el pie, pero el Ruby on Rails Guía utiliza app/views/shared en an example. Supongo que se trata de preferencia personal. Usaría layouts para cosas de alto nivel como un navegador principal o un pie de página, pero shared para cosas más estrechas a nivel de controlador como un formulario.

14

TL; DR

Rails 3.1, los carriles 4, carriles 5 y lo que viene a continuación búsquedas

app/views/application 

El motor de este camino automáticamente si la vista no se encuentra en la ruta de acceso del controlador.

carriles 3 y antes

app/views/shared 

El motor no busca esta ruta de forma automática.


Larga historia

Rails 3 (y la versión previa) tienen ningún valor predeterminado ubicación para almacenar puntos de vista compartidos.

La convención oficial es almacenar vistas compartida en app/views/ compartida. Dondequiera que iba a terminar su almacenamiento sin embargo, usted tiene que especificar la ruta

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

Esta sugerencia fue popularizado por Agile Web Development with Rails.

Rails 3.1 introduce un norma oficial para dónde almacenar puntos de vista compartidos:
app/views/aplicación

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

Los curiosos pueden seguir here el proceso de pensamiento detrás de esta decisión.

sintaxis Antiguo

# 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, todavía pueden hacer sus puntos de vista compartidos donde quiera y hacer referencia a ellos por el camino

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

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

Cuestiones relacionadas