El problema es que el layout no lo decide la vista que invoca a
render_component, sino la accion invocada.
Es decir, en la vista “padre” usas <%= render_component :controller
=> …, :action => …, :id => … %>
Mientras que en CursosController.calendarios, usas render :action =>
“calendarios”, :layout => false
No tengo experiencia con render_component, pero diría que simplemente
delega en el render del controlador y la acción especificada. Es
decir, mira en /cursos/calendarios y comprueba allí que estás haciendo
un render de plantilla sin layout
Sin animo de empezar una discusion de nunca acabar, no hagas caso de
la gente que dice que los componentes estan desaconsejados. En muchas
situaciones son la mejor solucion, en especial cuando lo que buscas
es encapsular pequeñas partes de tu aplicacion, sin estar intentando
proveer mecanismos de reuso de gran alcance (es decir, para un
calendario que esta en todas las paginas, pero no para hacer un
“componente de foros” que uses en varias aplicaciones)
El “mito” de que los componentes no son buenos tiene mucho que ver
con un post de DHH donde hablaba pestes de los componentes como
mecanismo de reuso entre aplicaciones, pero en general se referia al
subdirectorio “components” y no al simple “render_component”.
Me da mucha risa ver como la gente intenta resolver problemas
“componentizables” usando parciales, helpers y filtros, que lo que
hacen es dividir el problema en fragmentos separados mas dificiles de
entender e incluso menos eficientes. Simplemente porque un dia DHH
dijo que los componentes eran malos.
Hola a todos, Gracias por las respuestas , pero no entendi que es lo que
tengo que hacer para solucionar el problema
Sebastian escribió:
El problema es que el layout no lo decide la vista que invoca a
render_component, sino la accion invocada.
Es decir, en la vista “padre” usas <%= render_component :controller =>
…,
:action => …, :id => … %>
Mientras que en CursosController.calendarios, usas render :action =>
“calendarios”, :layout => false
quiere decir que tengo que poner
CursosController …
def show
render :action => “calendarios”, :layout => false
end
…
y en la vista poner <%= render_component :controller => …, :action =>
…, :id => … %>
Hola Sebastian, Gracias por la ayuda
Ahora funciona correctamente.
Pero en el caso donde accedo directamente a la vista
calendarios.rhtmldesde mi navegador me aparece sin el layout. Entiendo
porque sucede esto,
por eso buscaba la forma de bloquear el layout solo en la llamada de
render_component desde otro vista.
if params[:sin_layout]
render …, :layout => false
else
render …
end
Las llamadas directas no tienen el parametro asi que usan el layout
definido globalmente, mientras que la llamada de render_component
pasa el parametro apropiado y es generada sin layout
y en la vista poner <%= render_component :controller
=> …, :action => …, :id => … %>
Exactamente. El :layout va en la accion. En el render_component de la
vista inicial no colocas nada (digo, nada adicional a la accion y sus
parametros)