Rails 6 - 传递给部分时未定义的局部变量,但当我将调试器放入 erb 文件时定义了它

Posted

技术标签:

【中文标题】Rails 6 - 传递给部分时未定义的局部变量,但当我将调试器放入 erb 文件时定义了它【英文标题】:Rails 6 - undefined local variable when passed to a partial but it is defined when I put a debugger in the erb file 【发布时间】:2022-01-14 16:35:34 【问题描述】:

我将一个集合传递给一个部分:

<%= render partial: "discount_rule", collection: @programs.discount_rules, locals:  f: form  %>

局部变量f成功传递给partial。

我在部分中打印出我可用的局部变量:

<%= pp local_variables %>

我得到的结果是:

[:local_assigns, :output_buffer, :discount_rule, :discount_rule_counter, :discount_rule_iteration, :f]

我将添加一个调试器:

<% debugger %>

在终端中输入discount_rule 并获取包含name 字段的正确对象。

我将调试器替换为:

<%= discount_rule.name %>

所以它和调试器在同一个范围内。我明白了:

undefined local variable or method `discount_rule' for #<ActionView::Base:0x000000000078c8>

没有语法错误。我也尝试过discount_rule_counterdiscount_rule_iteration 并从集合中重命名变量名(使用as::variable_name)并得到未知的局部变量或方法错误。我试过不使用集合,只渲染部分并在每个循环中传递变量。同样的错误。我做错了什么?

这是一个仅限 Rails API 的应用程序,我必须稍作改动才能拥有一个页面。

【问题讨论】:

你试过使用local_assigns[:discount_rule]吗? @FelixOuttaSpace 你现在是我最喜欢的人! 欢迎答疑并获得积分 太棒了! 你能展示一下 f: form 是什么 【参考方案1】:

您应该使用local_assigns[:discount_rule] 来访问局部变量。

也可以使用collection: @programs.discount_rules, as: :discount_rule,并在视图中调用discount_rule

同时确保控制器中的数据不为零,并且您能够打印所需的属性,如名称,然后将其传递给部分,如.each do |instance| p.name

【讨论】:

如此接近。我庆祝得太早了。当我使用&lt;%= local_assigns[:discount_rule].to_json %&gt; 时,我可以看到 discount_rule 对象。但是我仍然无法访问像&lt;%= local_assigns[:discount_rule].name %&gt; 这样的任何字段,即使&lt;%= local_assigns[:discount_rule].class %&gt; 返回DiscountRule,它也是nilClass。您认为这是 Rails 6 的错误吗?我应该举报吗? 尝试在这里使用可能会有所帮助,所以它会是collection: @programs.discount_rules, as: :discount_rule,现在您不必在这里使用 local_assigns。你可以打电话给discount_rule。我不认为这是一个 Rails 错误,我在类似的情况下成功使用了它 也许也可以在控制器级别检查您的数据,以确保它在那里不为零。所以当它已经为零时,那么错误就是别的了。 我之前尝试过collection: @programs.discount_rules, as: :discount_rule,结果相同。我知道 discount_rules 不是零。我可以看到带有 local_assigns[:discount_rule].to_json 的 json 对象。我似乎无法用它做任何事情 创建了一个问题:github.com/rails/rails/issues/43826

以上是关于Rails 6 - 传递给部分时未定义的局部变量,但当我将调试器放入 erb 文件时定义了它的主要内容,如果未能解决你的问题,请参考以下文章

rails 部分模板中的可选局部变量:我如何摆脱(定义的?foo)混乱?

Rails 3:“未定义的局部变量或方法”如果我将内容放在部分中

使用 AJAX 刷新 Rails 部分时的未定义方法

如何将局部变量传递给熊猫中的用户定义函数?

python怎么将局部变量的值传递给全局变量

使用范围变量时未定义 Excel vba 变量