如何将多个局部传递给嵌套的局部

这应该是非常简单和有据可查的,我已经做了好几次了,虽然还有一些东西还在杀我。

我有一个部分调用嵌套部分的结构。

在某些时候,一个render调用需要将一个额外的变量传递给partial,尽管部分的渲染失败了:

 undefined local variable or method `' for #<# 

这是我调用render代码:

 = f.simple_fields_for :orders do |c| = render partial: "fields", locals: {f: c, step: f.object.step} 

虽然这也不起作用:

 = f.simple_fields_for :orders do |c| = render "fields", f: c, step: f.object.step 

这里是引发exception的地方:

 f.input :quantity, input_html: {step: step} 

form_for来自views/lists/_form.html.haml

 = simple_form_for( @order, :html => { :multipart => true }, defaults: { input_html: { class: 'input-medium' } } ) do |f| 

然后将f传递给views/orders/_order_forms.html via

 = render "orders/order_forms", f: f 

这是跟踪的例外:

  ActionView::Template::Error (undefined local variable or method `step' for #<#: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' 

框架跟踪(结束):

 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' 

我以前遇到过类似的问题,我在简化本地人的传递方面解决了这个问题。但现在我真的想了解发生了什么。

任何线索?

我正在使用:

 ruby 2.0.0p297 rails 3.2.8 

非常感谢提前..

UPDATE

我调试了我的视图并发现order_forms正在渲染两次,第一次没有设置step ,而在第二次渲染时它被正确设置。

我不确定为什么会发生这种情况,但我设法将其添加到我的fields.html.haml

 -step = step || 1 

基本上我将一个默认值设置为step,以防它未定义,以便在第一次执行时渲染不会崩溃,而在第二次执行时它可以正常工作。

该页面现在看起来如预期。 虽然我在考虑两次渲染这些东西时浪费资源。

为什么会发生这种情况?

在发现代码运行两次之后,我去调查了其他人正在运行它。

我意识到在调用cocoon函数link_to_add_association之前只有几行

当然,不仅官方render渲染部分,而且该function需要渲染它。

我添加了这一行:

 :render_options => {:locals => {:step => step }}, 

到我的link_to_add_association函数调用并删除了变通方法,现在一切都按预期工作。

与此类似的更现代的版本是:

 render_options: {locals: {step: step }}, 

有点短,看起来更好。