【问题标题】:How to pass multiple locals to a nested partial如何将多个本地人传递给嵌套的部分
【发布时间】:2013-08-27 13:16:57
【问题描述】:

这应该是非常简单且有据可查的,我已经做过好几次了,尽管有些东西仍然让我很头疼。

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

在某些时候,一个render 调用需要将一个额外的变量传递给部分,尽管部分的呈现失败并显示:

undefined local variable or method `<variable name>' for #<#<Class:....>

这是我调用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

这里是引发异常的地方:

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
= render "orders/order_forms", f: f

以下是跟踪的例外情况:

    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'

框架跟踪(结束):

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

提前非常感谢..

更新

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

我不确定为什么会发生这种情况,但我设法通过在我的fields.html.haml 中添加以下行来解决这个问题。

-step = step || 1

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

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

知道为什么会这样吗?

【问题讨论】:

  • 提示:如果您通过 f,则不需要 f.object.step
  • 是的,谢谢,我通过c 并称它为f,我只需要来自f.objectstep
  • 看起来正确,但我找不到任何东西。我用简单的表单和向导步骤测试了类似的场景,它在 rails 3.2 中对我有用。而不是直接在您的部分访问step,您检查了c.object.step(应该是相同的结果,但试一试)
  • 题外话:您使用的 Rails 版本容易受到安全漏洞的攻击,建议尽快升级到最新的 Rails 3.2 版本 - 请参阅 google.com/…
  • 谢谢,我已经更新到 3.2.14

标签: ruby-on-rails actionview partials


【解决方案1】:

在发现代码运行了两次之后,我去调查还有谁在运行它。

我意识到,就在调用 cocoon 函数 link_to_add_association 之前的几行代码

当然,不仅是官方的render 渲染部分,而且该函数需要渲染它。

我已经添加了这一行:

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

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

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

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

短一点,看起来更好。

【讨论】:

  • 我实际上只是遇到了这个确切的问题,它正在引起我的注意 - 似乎第二个本地被忽略了,但它是我的 link_to_add_association 稍后在我的代码中没有通过本地导致错误!我刚刚在我的部分中添加了一个if defined?(my_variable) then my_variable end,所以我不必确保每次渲染它时都包含它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多