19

me gustaría tener la siguiente estructura de directorios:¿Cómo puedo agregar una ruta de vista a la búsqueda de representación parcial de Rails?

views/ 
    app1/ 
    users/_user.html.erb 
    users/index.html.erb 

    app2/ 
    users/index.html.erb 

    shared/ 
    users/_user.html.erb 
    users/index.html.erb 

En mi opinión, me gustaría llamar

# app1/users/index.html 
<%= render :partial => "user" %> 
# => /app1/users/_user.html.erb 


# app2/users/index.html 
<%= render :partial => "user" %> 
# => /shared/users/_user.html.erb 

Así que, básicamente, ¿cómo le digo rieles para comprobar en el/app2/¿Los usuarios dirán luego el directorio compartido antes de que aparezca su error de plantilla faltante?

actualización


llegué alrededor de este (según lo sugerido por Senthil, utilizando File.exist?

aquí está mi solución - comentarios y sugerencias bienvenidos

# application_helper.rb 

# Checks for a partial in views/[vertical] before checking in views/shared 
def partial_or_default(path_name, options={}, &block) 
    path_components   = path_name.split("/") 
    file_name    = path_components.pop 
    vertical_file_path  = File.join(vertical}, path_components, file_name) 
    shared_file_path  = File.join("shared", path_components, file_name) 
    full_vertical_file_path = File.join("#{Rails.root}/app/views/", "_#{vertical_file_path}.html.erb") 
    attempt_file_path  = File.exist?(full_vertical_file_path) ? vertical_file_path : shared_file_path 
    render({:partial => attempt_file_path}.merge(options), &block) 
end 
+1

¿Por qué no puede usar 'File.exists?' Para verificar si el archivo sale y muestra el archivo apropiado? –

Respuesta

61

Ya hay algo construido en los rieles que facilita este tipo de "tematización" para usted. Se llama prepend_view_path.

http://api.rubyonrails.org/classes/ActionView/ViewPaths/ClassMethods.html#method-i-prepend_view_path

También hay append_view_path para añadir rutas al extremo de la pila de búsqueda.

Tengo esta trabajando con éxito en la producción:

class ApplicationController < ActionController::Base 
    before_filter :prepend_view_paths 

    def prepend_view_paths 
    prepend_view_path "app/views/#{current_app_code}" 
    end 
end 

Ahora cada controlador buscará primero en "puntos de vista/app1" (o lo que sea su nombre dinámico resulta ser) para las vistas correspondientes a la acción siendo llamado.

También es lo suficientemente inteligente como para comprobar todas las rutas definidas para el archivo que está buscando, por lo que retrocede a la ubicación predeterminada si no se encuentra una.

+0

¡Esto es realmente increíble! Me gustaría que tuviéramos esta implementación ... pero esto ya se ha descrito en railscasts.269 (pero tu respuesta ya lo dice todo) – ecoologic

+1

La URL correcta es: http://api.rubyonrails.org/classes/ActionController/Base. html # M000267 – davidcollom

+0

Viejo, pero hay un método de clase para esto en lugar de hacer esto con un filtro –

Cuestiones relacionadas