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_counter
和discount_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
【讨论】:
如此接近。我庆祝得太早了。当我使用<%= local_assigns[:discount_rule].to_json %>
时,我可以看到 discount_rule 对象。但是我仍然无法访问像<%= local_assigns[:discount_rule].name %>
这样的任何字段,即使<%= local_assigns[:discount_rule].class %>
返回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)混乱?