Estoy tratando de reutilizar un componente html que he escrito que proporciona estilo de panel. Algo como:
<div class="v-panel">
<div class="v-panel-tr"></div>
<h3>Some Title</h3>
<div class="v-panel-c">
.. content goes here
</div>
<div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
</div>
Entonces veo que el render toma un bloque. Entonces pensé que podría hacer algo como esto:
# /shared/_panel.html.erb
<div class="v-panel">
<div class="v-panel-tr"></div>
<h3><%= title %></h3>
<div class="v-panel-c">
<%= yield %>
</div>
<div class="v-panel-b"><div class="v-panel-br"></div><div class="v-panel-bl"></div></div>
</div>
Y quiero hacer algo como:
#some html view
<%= render :partial => '/shared/panel', :locals =>{:title => "Some Title"} do %>
<p>Here is some content to be rendered inside the panel</p>
<% end %>
Desafortunadamente, esto no funciona con este error:
ActionView::TemplateError (/Users/bradrobertson/Repos/VeloUltralite/source/trunk/app/views/sessions/new.html.erb:1: , unexpected tRPAREN
old_output_buffer = output_buffer;;@output_buffer = ''; __in_erb_template=true ; @output_buffer.concat(( render :partial => '/shared/panel', :locals => {:title => "Welcome"} do ).to_s)
on line #1 of app/views/sessions/new.html.erb:
1: <%= render :partial => '/shared/panel', :locals => {:title => "Welcome"} do -%>
...
Entonces no le gusta el =
obviamente con un bloque, pero si lo elimino, entonces simplemente no genera nada.
¿Alguien sabe cómo hacer lo que estoy tratando de lograr aquí? Me gustaría reutilizar este html de panel en muchos lugares de mi sitio.
ruby-on-rails
render
partial
block
puntilla
fuente
fuente
layout
solución alternativa, consulte guides.rubyonrails.org/…Respuestas:
Si bien ambas respuestas anteriores funcionan (bueno, el ejemplo al que Tony enlaza de todos modos) terminé encontrando la respuesta más concisa en esa publicación anterior (comentario de Kornelis Sietsma)
Supongo que
render :layout
hace exactamente lo que estaba buscando:combinado con:
fuente
<%= %>
lugar de<% %>
, por ejemplo<%= render :layout => '/shared/panel',
<%= render '/shared/panel', title: 'some title' do %>
Aquí hay una alternativa basada en respuestas anteriores.
Crea tu parcial en
shared/_modal.html.erb
:Defina su método en
application_helper.rb
:Llámalo desde cualquier vista:
fuente
Puede usar el asistente de captura e incluso en línea en la llamada de renderizado:
y en panel / compartido:
que producirá:
Ver http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html
fuente
Según la respuesta aceptada, esto es lo que funcionó bien para mí usando Rails 4.
Podemos renderizar un panel como tal:
Esto requiere un método auxiliar y una vista compartida:
método de ayuda (ui_helper.rb)
Ver (/ui/panel.html.haml)
fuente
panel.html.haml
a_panel.html.haml
Creo que funcionará (solo hice una prueba rápida y sucia) si primero la asigna a una variable y luego la genera.
fuente