3

これは非常に簡単で、十分に文書化されているはずです。私は何度かそれを実行しましたが、まだ私を殺していることがあります.

ネストされたパーシャルを呼び出すパーシャルの構造があります。

ある時点renderで、パーシャルのレンダリングは次のエラーで失敗しますが、1 つの呼び出しで追加の変数をパーシャルに渡す必要があります。

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|

fviews/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が 2 回レンダリングされていることがわかりました。最初stepは設定されていませんが、2 回目のレンダリングでは正しく設定されています。

なぜこれが起こるのかはわかりませんが、次の行を my に追加することで回避できましたfields.html.haml

-step = step || 1

基本的に、ステップが定義されていない場合に備えて、デフォルト値をステップに設定します。これにより、最初の実行でレンダリングがクラッシュせず、2 回目の実行で適切に動作します。

ページは期待どおりに表示されます。ものを2回レンダリングするときのリソースの浪費について考えていますが。

なぜそれが起こるのかについて何か考えはありますか?

4

1 に答える 1