Como passar vários locais para uma parcial aninhada
Isso deve ser extremamente simples e bem documentado, e já fiz isso várias vezes, embora haja algo que ainda esteja me matando.
Eu tenho uma estrutura de parciais chamando parciais aninhadas.
Em algum momento umrender
A chamada precisa passar uma variável extra para a parcial, embora a renderização da parcial falhe com um:
undefined local variable or method `<variable name>' for #<#<Class:....>
Aqui está o meu código para ligar para orender
:
= f.simple_fields_for :orders do |c|
= render partial: "fields", locals: {f: c, step: f.object.step}
embora isso não funcione:
= f.simple_fields_for :orders do |c|
= render "fields", f: c, step: f.object.step
aqui é onde a exceção é levantada:
f.input :quantity, input_html: {step: step}
o form_for vem doviews/lists/_form.html.haml
:
= simple_form_for( @order, :html => { :multipart => true }, defaults: { input_html: { class: 'input-medium' } } ) do |f|
f
é então passado paraviews/orders/_order_forms.html
através da
= render "orders/order_forms", f: f
aqui está a exceção com trace:
ActionView::Template::Error (undefined local variable or method `step' for #<#<Class:0x007fe0479ba2b0>:0x007fe04256a930>):
application trace:
app/views/orders/_fields.html.haml:9:in `_app_views_orders__fields_html_haml___1860431911739668171_70300581339300'
app/views/orders/_order_forms.html.haml:30:in `_app_views_orders__order_forms_html_haml__2241963939037094859_70300612771460'
app/views/lists/_form.html.haml:48:in `block in _app_views_lists__form_html_haml__1669043093238943449_70300583658680'
app/views/lists/_form.html.haml:3:in `_app_views_lists__form_html_haml__1669043093238943449_70300583658680'
app/views/lists/new.html.erb:3:in `_app_views_lists_new_html_erb___1563391577928218041_70300593681100'
app/controllers/lists_controller.rb:67:in `new'
rastreamento de estrutura (o final):
actionpack (3.2.8) lib/action_view/template.rb:145:in `block in render'
activesupport (3.2.8) lib/active_support/notifications.rb:125:in `instrument'
actionpack (3.2.8) lib/action_view/template.rb:143:in `render'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:265:in `render_partial'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:238:in `block in render'
actionpack (3.2.8) lib/action_view/renderer/abstract_renderer.rb:38:in `block in instrument'
activesupport (3.2.8) lib/active_support/notifications.rb:123:in `block in instrument'
activesupport (3.2.8) lib/active_support/notifications/instrumenter.rb:20:in `instrument'
activesupport (3.2.8) lib/active_support/notifications.rb:123:in `instrument'
actionpack (3.2.8) lib/action_view/renderer/abstract_renderer.rb:38:in `instrument'
actionpack (3.2.8) lib/action_view/renderer/partial_renderer.rb:237:in `render'
actionpack (3.2.8) lib/action_view/renderer/renderer.rb:41:in `render_partial'
actionpack (3.2.8) lib/action_view/helpers/rendering_helper.rb:27:in `render'
haml (4.0.3) lib/haml/helpers/action_view_mods.rb:10:in `block in render_with_haml'
haml (4.0.3) lib/haml/helpers.rb:89:in `non_haml'
haml (4.0.3) lib/haml/helpers/action_view_mods.rb:10:in `render_with_haml'
cocoon (1.2.0) lib/cocoon/view_helpers.rb:40:in `block in render_association'
Eu tive um problema semelhante antes e resolvi isso simplificando a passagem dos locais .. mas agora eu realmente gostaria de entender o que está acontecendo.
qualquer pista?
Estou a usar:
ruby 2.0.0p297
rails 3.2.8
Muito obrigado antecipadamente ..
ATUALIZAR
Eu depurei meu ponto de vista e percebi que oorder_forms
está sendo processado duas vezes, pela primeira vezstep
não está definido, enquanto no segundo processamento está definido corretamente.
Não sei por que isso acontece, mas consegui trabalhar com a seguinte linha para o meufields.html.haml
.
-step = step || 1
basicamente eu coloco um valor padrão para step, caso ele não esteja definido, de modo que na primeira execução a renderização não trave, enquanto na segunda execução ela funcione corretamente.
A página parece como esperado agora. Embora eu esteja pensando sobre o desperdício de recursos ao renderizar as coisas duas vezes.
Alguma idéia de por que isso acontece?