¿Cómo puedo agregar una ruta de visualización a la búsqueda de renderizado parcial de Rails?
-
08-09-2020 - |
Pregunta
Me gustaría tener la siguiente estructura de directorios:
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, llamaría
# app1/users/index.html
<%= render :partial => "user" %>
# => /app1/users/_user.html.erb
# app2/users/index.html
<%= render :partial => "user" %>
# => /shared/users/_user.html.erb
Básicamente, ¿cómo le digo a Rails que verifique el directorio /app2/users y luego el directorio compartido antes de que genere el error de falta de plantilla?
Actualizar
Solucioné esto (como lo sugirió Senthil, usando 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
Solución
Ya hay algo integrado en los rieles que le facilita este tipo de "temática".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 agregar rutas al final de la pila de búsqueda.
Tengo esto funcionando exitosamente en 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 "vistas/aplicación1" (o cualquiera que sea su nombre dinámico) las vistas correspondientes a la acción que se llama.
También es lo suficientemente inteligente como para verificar todas las rutas definidas para el archivo que está buscando, por lo que regresa a la ubicación predeterminada si no encuentra ninguna.