rails mvc how ruby-on-rails render partial block

ruby on rails - mvc - Rieles render parcial con bloque



routes in ruby on rails (5)

Aquí hay una alternativa basada en respuestas anteriores.

Cree su parcial en shared/_modal.html.erb :

<div class="ui modal form"> <i class="close icon"></i> <div class="header"> <%= heading %> </div> <div class="content"> <%= capture(&block) %> </div> <div class="actions"> <div class="ui negative button">Cancel</div> <div class="ui positive button">Ok</div> </div> </div>

Defina su método en application_helper.rb :

def modal_for(heading, &block) render( partial: ''shared/modal'', locals: { heading: heading, block: block } ) end

Llámalo desde cualquier punto de vista:

<%= modal_for(''My Title'') do |t| %> <p>Here is some content to be rendered inside the partial</p> <% end %>

Estoy tratando de volver a utilizar un componente html que he escrito que proporciona el estilo del 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 render toma un bloque. Pensé que podría hacer algo así:

# /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 %>

Lamentablemente, 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 -%> ...

Por lo tanto, 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 volver a utilizar este panel html en muchos lugares de mi sitio.


Basado en la respuesta aceptada, esto es lo que funcionó bien para mí al usar Rails 4.

Podemos renderizar un panel como tal:

= render_panel(''Non Compliance Reports'', type: ''primary'') do %p your content goes here!

Esto requiere un método de ayuda y una vista compartida:

método de ayuda (ui_helper.rb)

def render_panel(heading, options = {}, &block) options.reverse_merge!(type: ''default'') options[:panel_classes] = ["panel-#{options[:type]}"] render layout: ''/ui/panel'', locals: { heading: heading, options: options } do capture(&block) end end

Ver (/ui/panel.html.haml)

.panel{ class: options[:panel_classes] } .panel-heading= heading .panel-body = yield


Creo que funcionará (simplemente hice una prueba rápida y sucia) si primero lo asignas a una variable y luego la envías.

<% foo = render :partial => ''/shared/panel'', :locals =>{:title => "Some Title"} do %> <p>Here is some content to be rendered inside the panel</p> <% end %> <%= foo %>


Puede usar el asistente de captura, e incluso en línea en la llamada de renderizado:

<%= render ''my_partial'', :locals => { :title => "Some Title" }, :captured => capture { %> <p>Here is some content to be rendered inside the partial</p> <% } %>

y en compartido / panel:

<h3><%= title %></h3> <div class="my-outer-wrapper"> <%= captured %> </div>

que producirá:

<h3>Some Title</h3> <div class="my-outer-wrapper"> <p>Here is some content to be rendered inside the partial</p> </div>

Ver http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html


Si bien ambas respuestas anteriores funcionan (bueno, el ejemplo al que tony se vincula de todos modos) terminé encontrando la respuesta más breve en la publicación anterior (comentario de Kornelis Sietsma)

Supongo que render :layout hace exactamente lo que estaba buscando:

# Some View <%= render :layout => ''/shared/panel'', :locals => {:title => ''some title''} do %> <p>Here is some content</p> <% end %>

combinado con:

# /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>